Delphi   发布时间:2022-04-11  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Delphi Unicode字符串长度(以字节为单位)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在将一些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的一般理解是,即使在2个字节中也不能表示所有的unicode字符,所以一些角色外部的字符将占用4个字节. Another of embarcadero’s articles似乎证实了我的怀疑,“其实呢,一个Char不等于两个字节!

所以…让我想知道长度(rawHtml)* SizeOf(Char)是否真的足够强大以保持一致的准确性,或者是否有更好的方法来确定字符串的大小会更准确?

解决方法

您对于Delphi的UnicodeString的UTF-16编码是正确的.这意味着一个16位字符足够宽,可以将Basic Multilingual Plane中的所有code points作为字符串数组的一个Char元素.

但是,这里有一点误解.长度函数不会对字符进行任何深度检查,只需返回16位WideChar元素的数量,而不虑字符串中的任何代理.这意味着如果您将任何Supplementary Planes中的单个字符分配给UnicodeString,则长度将返回2.

program Egyptian;

{$APPTYPE CONSOLE}

var
  S: UnicodeString;

begin
  S := #$1304E;  // single char
  Writeln(Length(S));
  Readln;
end.

结论:字符串数据的字节大小始终是固定的,并且等于Length(S)* SizeOf(Char),无论S是否包含任何可变长度的字符.

大佬总结

以上是大佬教程为你收集整理的Delphi Unicode字符串长度(以字节为单位)全部内容,希望文章能够帮你解决Delphi Unicode字符串长度(以字节为单位)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。