我正在將一些古老的(從2003年)Delphi代碼升級到Delphi Architect XE,我遇到了一些問題。如果存在不兼容的類型,我會遇到一些錯誤。這些錯誤不會發生在Delphi 6中,所以我必須假設這是因爲事情已經升級。WideChar和AnsiChar有什麼區別?
我真的不知道PAnsiChar和PWideChar之間的區別是什麼,但德爾福確切知道的區別,不會讓我的編譯。如果我知道這些差異是什麼,也許我可以找出使用哪個或如何解決這個問題。
我正在將一些古老的(從2003年)Delphi代碼升級到Delphi Architect XE,我遇到了一些問題。如果存在不兼容的類型,我會遇到一些錯誤。這些錯誤不會發生在Delphi 6中,所以我必須假設這是因爲事情已經升級。WideChar和AnsiChar有什麼區別?
我真的不知道PAnsiChar和PWideChar之間的區別是什麼,但德爾福確切知道的區別,不會讓我的編譯。如果我知道這些差異是什麼,也許我可以找出使用哪個或如何解決這個問題。
短:至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
。
編譯器會佔用大量的轉化本身的照顧,但也有一些問題:
PChar
,你需要確保你的指針指向正確的數據類型,編譯器不能總是驗證這一點。string
作爲一種方便的字節數組緩衝器,用於保存任意數據,而不是保存文本的變量,這將不作爲UnicodeString
工作。確保將這些聲明爲RawByteString
作爲解決方法。char
是一個字節長。看看Delphi Unicode Migration for Mere Mortals的一些更多技巧和建議如何讓這個工作。這聽起來並不難,但也不是微不足道的。祝你好運!
看來我可能已經回答了我自己的問題。當WideChar保持[0 ... 65,535]時,AnsiChar只保持[0 ... 255]。我認爲WideChar是unicode或什麼的。 – Daisetsu 2011-02-08 23:58:17