gpt4 book ai didi

Delphi Unicode 字符串长度(以字节为单位)

转载 作者:行者123 更新时间:2023-12-03 14:38:19 25 4
gpt4 key购买 nike

我正在致力于将一些 Delphi 7 代码移植到 XE4,因此,unicode 是这里的主题。

我有一个将字符串写入 TMemoryStream 的方法,因此根据 this embarcadero article ,我应该将字符串的长度(以字符为单位)乘以 Char 类型的大小,以获得 WriteBuffer 的长度(以字节为单位)参数所需的长度(以字节为单位)。

所以之前:

rawHtml : string; //AnsiString
...
memorystream1.WriteBuffer(Pointer(rawHtml)^, Length(rawHtml);

之后:

rawHtml : string; //UnicodeString
...
memorystream1.WriteBuffer(Pointer(rawHtml)^, Length(rawHtml)* SizeOf(Char));

我对Delphi的UnicodeString类型的理解是它内部是UTF-16。但我对 Unicode 的一般理解是,并不是所有的 Unicode 字符都可以用 2 个字节来表示,某些极端情况下的外来字符将占用 4 个字节。 Another of embarcadero's articles似乎证实了我的怀疑,“事实上,一个 Char 等于两个字节并不总是正确的!”

所以......这让我想知道 Length(rawHtml)* SizeOf(Char) 是否真的足够强大以始终准确,或者是否有更好的方法来确定大小哪个字符串会更准确?

最佳答案

Delphi 的 UnicodeString 使用 UTF-16 编码。 UTF-16 是一种可变长度编码,就像 UTF-8 一样。换句话说,单个 Unicode 代码点可能需要多个字符元素对其进行编码。有趣的是,唯一的固定长度 Unicode 编码是 UTF-32。 UTF-16 编码使用 16 位字符元素,因此得名。

在 Unicode Delphi 中,CharWideChar 的别名,后者是 UTF-16 字符元素。 stringUnicodeString 的别名,它是 WideChar 元素的数组。 Length() 函数返回数组中的元素数量。

因此,UnicodeStringSizeOf(Char) 始终为 2。某些 Unicode 代码点使用多个字符元素或 Char 进行编码。但Length()返回字符元素的数量,而不是代码点的数量。字符元素都具有相同的大小。所以

memorystream1.WriteBuffer(Pointer(rawHtml)^, Length(rawHtml)* SizeOf(Char));

正确。

关于Delphi Unicode 字符串长度(以字节为单位),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16529992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com