WideChar和AnsiChar有什么区别?

10

我正在将一些古老的(来自2003年)Delphi代码升级到Delphi Architect XE,但是遇到了一些问题。我遇到了一些不兼容类型的错误。在Delphi 6中没有发生这些错误,因此我必须认为这是因为进行了升级。

说实话,我不知道PAnsiChar和PWideChar之间的区别,但是Delphi肯定知道区别,并且不让我编译。如果我知道它们之间的区别,也许我就可以弄清楚该使用哪种或如何修复此问题。


看起来我可能已经回答了自己的问题。AnsiChar只能容纳[0...255],而WideChar可以容纳[0...65,535]。我猜WideChar是Unicode或者其他什么东西。 - Daisetsu
D2009 中的 Unicode 升级是一个相当大的增强... 你需要仔细检查你的代码并检查字符串类型。如果你使用通用数据类型 StringChar,那么一切都应该正确地映射到正确的字符串类型... - Jørn E. Angeltveit
2个回答

19

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

8 位 chars 被称为 "Ansi Chars"。PAnsiChar 是指向 8 位 chars 的指针。 16 位 chars 被称为 "Wide Chars"。PWideChar 是指向 16 位 chars 的指针。 Delphi 知道这种区别,并且在不允许您混合使用两种字符时表现得很好!

更多信息

这是有关 Unicode 的一个流行的链接:每个软件开发人员都必须绝对、肯定地了解有关 Unicode 和字符集的绝对最低限度

您可以在此处找到有关将 Delphi 迁移到 Unicode 的更多信息:新白皮书:普通人的 Delphi Unicode 迁移

您也可以在 SO 上搜索 "Delphi Unicode 迁移"。


10
几年前,Delphi的默认字符类型从表示ANSI字符的单字节变量AnsiChar更改为表示UTF16字符的双字节变量WideChar。char类型现在是WideChar的别名,而不是AnsiChar,string类型现在是UnicodeString的别名(Delphi传统字符串类型的UTF-16 Unicode版本),而不是AnsiString,PChar类型现在是PWideChar的别名,而不是PAnsiChar。
编译器可以自动处理许多转换问题,但还有一些问题:
  1. 如果您正在使用字符串指针类型,例如PChar,则需要确保指针指向正确类型的数据,而编译器并不总是能够验证这一点。
  2. 如果您将字符串传递给var参数,则变量类型需要完全相同。现在您有两种字符串类型要处理,这可能会更加复杂。
  3. 如果您使用string作为方便的字节数组缓冲区来保存任意数据,而不是保存文本的变量,则无法作为UnicodeString。请确保将其声明为RawByteString以解决问题。
  4. 在任何涉及字符串字节长度的地方,例如在读取或写入TStream时,请确保您的代码没有假定一个char只有一个字节长。

查看Delphi Unicode Migration for Mere Mortals获取更多技巧和建议,以使其正常工作。这并不像听起来那么困难,但也不是微不足道的。祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接