我正在将一些旧的(从2003年开始的) Delphi代码升级到Delphi Architect XE,我遇到了一些问题。在存在不兼容类型的情况下,我收到了许多错误。这些错误在Delphi 6中不会发生,所以我必须假设这是因为东西已经升级了。
老实说,我不知道PAnsiChar和PWideChar之间的区别是什么,但Delphi肯定知道不同之处,不让我编译。如果我知道它们的不同之处,也许我就能想出该用哪一个,或者如何解决这个问题。
发布于 2011-02-09 08:09:17
在Delphi2009之前,中的原生字符串类型通常是ANSI CHAR:每个字符串中的每个字符都被表示为一个8位字符。从Delphi2009Delphi开始,使用UTF-16表示法,Delphi的字符串变成了UNICODE :现在基本字符使用16位数据(2字节),您可能不需要太多地了解表示为两个连续的16位字符的Unicode代码点。
8位字符被称为"Ansi字符“。PAnsiChar是指向8位字符的指针。16位字符被称为“宽字符”。PWideChar是指向16位字符的指针。Delphi知道其中的区别,如果它不允许您混合使用这两种语言,它会做得很好!
更多信息
这里有一个关于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迁移“。
发布于 2011-02-09 08:07:35
几年前,Delphi中的默认字符类型从AnsiChar (表示UTF16字符的单字节变量)更改为WideChar (表示ANSI字符的双字节变量)。char类型现在是WideChar而不是AnsiChar的别名,string类型现在是UnicodeString (Delphi传统字符串类型的UTF-16Unicode版本)的别名,而不是AnsiString,PChar类型现在是PWideChar而不是PAnsiChar的别名。
编译器本身可以处理很多转换,但有几个问题:
PChar,则需要确保指针指向正确的数据类型,而编译器并不总是能验证这一点。string作为一个方便的字节数组缓冲区来保存任意数据,而不是一个保存文本的变量,那么它就不能作为UnicodeString使用。确保将它们声明为workaround.RawByteString您正在处理字符串字节长度,例如,在读取或写入TStream时,请确保您的代码没有假设char为一个字节。看看Delphi Unicode Migration for Mere Mortals,了解更多关于如何使其工作的技巧和建议。这并不像听起来那么难,但也不是微不足道的。祝好运!
https://stackoverflow.com/questions/4939854
复制相似问题