我正在将一些 Delphi 7 代码移植到 XE4,因此,unicode 是这里的主题。
我有一个将字符串写入 TMemoryStream 的方法,因此根据这篇 embarcadero 文章,我应该将字符串的长度(以字符为单位)乘以 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 个字节。embarcadero 的另一篇文章似乎证实了我的怀疑,“事实上,一个 Char 等于两个字节甚至并不总是正确的!”
所以......这让我想知道是否Length(rawHtml)* SizeOf(Char)
真的足够强大以保持一致准确,或者是否有更好的方法来确定更准确的字符串大小?