WideChar 和 AnsiChar 有啥区别?

Posted

技术标签:

【中文标题】WideChar 和 AnsiChar 有啥区别?【英文标题】:What is the difference between WideChar and AnsiChar?WideChar 和 AnsiChar 有什么区别? 【发布时间】:2011-06-23 19:34:23 【问题描述】:

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

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

【问题讨论】:

看来我可能已经回答了我自己的问题。 AnsiChar 仅持有 [0...255] 而 WideChar 持有 [0...65,535]。我假设 WideChar 是 unicode 什么的。 D2009 中的 Unicode 升级是一个安静的大改进……您需要仔细检查您的代码并检查字符串类型。如果您使用通用数据类型StringChar,那么所有内容都应该正确映射到正确的字符串类型... 【参考方案1】:

简而言之: 在 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 的热门链接: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 迁移”。

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

以上是关于WideChar 和 AnsiChar 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

delphi 'Char' and 'AnsiChar'报错问题

Sting 与 WideString, PChar 与 PWideChar[草稿版]

delphi基本数据类型有哪几种

delphi不同版本字符串类型的演化

将两个字节合并为 WideChar

WideChar 到字节?