WideChar和AnsiChar有什么区别?

时间:2011-02-08 23:47:52

标签: delphi widechar

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

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

2 个答案:

答案 0 :(得分: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上的热门链接:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets

您可以在此处找到有关将Delphi迁移到Unicode的更多信息:New White Paper: Delphi Unicode Migration for Mere Mortals

您也可以搜索SO以查找“Delphi Unicode迁移”。

答案 1 :(得分:10)

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

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

  1. 如果您正在使用字符串指针类型,例如PChar,则需要确保指针指向正确的数据类型,并且编译器无法始终验证这一点。
  2. 如果您将字符串传递给 var 参数,则变量类型必须完全相同。现在你可以处理两种字符串类型,这可能会更复杂。
  3. 如果您使用string作为方便的字节数组缓冲区来保存任意数据而不是保存文本的变量,那么它将无法用作UnicodeString。确保将这些声明为RawByteString作为解决方法。
  4. 您正在处理字符串字节长度的任何地方,例如在读取或写入TStream时,请确保您的代码不假设char是一个字节长。
  5. 看看Delphi Unicode Migration for Mere Mortals有关如何使其发挥作用的更多技巧和建议。它并不像听起来那么难,但它也不是微不足道的。祝你好运!