WideChar和AnsiChar有什么区别?

问题描述:

我正在将一些古老的(从2003年)Delphi代码升级到Delphi Architect XE,我遇到了一些问题。如果存在不兼容的类型,我会遇到一些错误。这些错误不会发生在Delphi 6中,所以我必须假设这是因为事情已经升级。WideChar和AnsiChar有什么区别?

我真的不知道PAnsiChar和PWideChar之间的区别是什么,但德尔福确切知道的区别,不会让我的编译。如果我知道这些差异是什么,也许我可以找出使用哪个或如何解决这个问题。

+0

看来我可能已经回答了我自己的问题。当WideChar保持[0 ... 65,535]时,AnsiChar只保持[0 ... 255]。我认为WideChar是unicode或什么的。 – Daisetsu 2011-02-08 23:58:17

短:至2009年的Delphi之前在Delphi天然字符串类型曾经是ANSI CHAR:在每一个串的每个字符表示为一个8位的字符。从Delphi 2009开始德尔福的字符串变成UNICODE,使用UTF-16符号:现在基本的Char使用16位数据(2字节),并且您可能不需要了解很多关于Unicode代码点的信息连续的16位字符。

的8个字符被称为“安思个字符”。 PAnsiChar是一个指向8位字符的指针。 16位字符被称为“宽字符”。 PWideChar是指向16位字符的指针。 德尔福知道的差异,并做得很好,如果它不允许你混合两个!

更多信息

这里有一个统一的热门链接:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets

您可以找到有关迁移德尔福为Unicode这里一些更多的信息:New White Paper: Delphi Unicode Migration for Mere Mortals

您可能也SO搜索“德尔福Unicode迁移“。

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

编译器会占用大量的转化本身的照顾,但也有一些问题:

  1. 如果你使用的字符串指针类型,如PChar,你需要确保你的指针指向正确的数据类型,编译器不能总是验证这一点。
  2. 如果你传递字符串VAR参数,变量的类型必须是完全一样的。这可能会更复杂,因为你有两种字符串类型需要处理。
  3. 如果您使用string作为一种方便的字节数组缓冲器,用于保存任意数据,而不是保存文本的变量,这将不作为UnicodeString工作。确保将这些声明为RawByteString作为解决方法。
  4. 随地你正在阅读或从T流写入/时处理字符串的字节长度,例如,请确保您的代码没有假设一个char是一个字节长。

看看Delphi Unicode Migration for Mere Mortals的一些更多技巧和建议如何让这个工作。这听起来并不难,但也不是微不足道的。祝你好运!