我正在将一些古老的(从2003年)Delphi代码升级到Delphi Architect XE,我遇到了一些问题。我遇到了许多类型不兼容的错误。这些错误在Delphi 6中不会发生,因此我必须假设这是因为事情已经升级。
老实说,我不知道PAnsiChar和PWideChar之间的区别是什么,但Delphi肯定知道区别并且不会让我编译。如果我知道差异是什么,我可以弄清楚使用哪个或如何解决这个问题。
答案 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
。
编译器可以自己处理很多转换,但是有一些问题:
PChar
,则需要确保指针指向正确的数据类型,并且编译器无法始终验证这一点。string
作为方便的字节数组缓冲区来保存任意数据而不是保存文本的变量,那么它将无法用作UnicodeString
。确保将这些声明为RawByteString
作为解决方法。char
是一个字节长。看看Delphi Unicode Migration for Mere Mortals有关如何使其发挥作用的更多技巧和建议。它并不像听起来那么难,但它也不是微不足道的。祝你好运!