2011-02-08 56 views
8

我正在將一些古老的(從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

回答

18

短:至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遷移「。

9

幾年前,在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的一些更多技巧和建議如何讓這個工作。這聽起來並不難,但也不是微不足道的。祝你好運!