WideChar和AnsiChar有什么区别?

Dai*_*tsu 9 delphi widechar

我正在将一些古老的(从2003年)Delphi代码升级到Delphi Architect XE,我遇到了一些问题.我遇到了许多类型不兼容的错误.这些错误在Delphi 6中不会发生,因此我必须假设这是因为事情已经升级.

老实说,我不知道PAnsiChar和PWideChar之间的区别是什么,但Delphi肯定知道它的区别,不会让我编译.如果我知道差异是什么,我可以弄清楚使用哪个或如何解决这个问题.

Cos*_*und 19

简短:在Delphi 2009之前,Delphi中的本地字符串类型曾经是ANSI CHAR:每个字符串中的每个字符都表示为8位字符.从Delphi 2009开始Delphi的字符串变为UNICODE,使用UTF-16表示法:现在基本的Char使用16位数据(2个字节),您可能不需要了解很多关于表示为两个的Unicode代码点连续的16位字符.

8位字符称为"Ansi Chars".PAnsiChar是指向8位字符的指针.16位字符称为"宽字符".PWideChar是指向16位字符的指针.德尔福知道差异,如果它不允许你混合这两者,那就很好!

更多信息

这是一个关于Unicode的流行链接:绝对最低每个软件开发人员绝对必须知道Unicode和字符集

您可以在此处找到有关将Delphi迁移到Unicode的更多信息:新白皮书:仅适用于凡人的Delphi Unicode迁移

您也可以在SO中搜索"Delphi Unicode migration".


Mas*_*ler 10

几年前,Delphi中的默认字符类型从AnsiChar(表示ANSI字符的单字节变量)更改为WideChar(表示UTF16字符的双字节变量).该char类型现在是别名WideChar而不是AnsiChar,string类型现在是一个别名UnicodeString(一个UTF-16 Unicode版本的Delphi的传统字符串类型)而不是AnsiString,而且该PChar类型现在是别名PWideChar而不是PAnsiChar.

编译器可以自己处理很多转换,但是有一些问题:

  1. 如果您正在使用字符串指针类型,例如PChar,您需要确保指针指向正确类型的数据,并且编译器无法始终验证这一点.
  2. 如果要将字符串传递给var参数,则变量类型必须完全相同.由于您有两种字符串类型需要处理,因此这可能会更复杂.
  3. 如果您string使用方便的字节数组缓冲区来保存任意数据而不是保存文本的变量,那么它将不能用作UnicodeString.确保将这些声明为RawByteString变通方法.
  4. 您正在处理字符串字节长度的任何地方,例如在读取或写入TStream时,请确保您的代码不假设a char是一个字节长.

看看Delphi Unicode Migration for Mere Mortals,了解更多技巧和建议,了解如何使其工作.它并不像听起来那么难,但它也不是微不足道的.祝好运!