10

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

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

4

2 回答 2

19

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

8 位字符称为“Ansi 字符”。PAnsiChar 是一个指向 8 位字符的指针。16 位字符称为“宽字符”。PWideChar 是指向 16 位字符的指针。Delphi 知道其中的区别,如果它不允许您将两者混合使用,它会做得很好!

更多信息

这是一个关于 Unicode 的流行链接:每个软件开发人员绝对、肯定必须了解 Unicode 和字符集的绝对最小值

您可以在此处找到有关将 Delphi 迁移到 Unicode 的更多信息:新白皮书:Delphi Unicode Migration for Mere Mortals

您也可以在 SO 中搜索“Delphi Unicode 迁移”。

于 2011-02-09T00:09:17.047 回答
10

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

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

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

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

于 2011-02-09T00:07:34.913 回答