其他需要注意的代碼:
AllocMem(
AnsiChar
of AnsiChar
AnsiString
of Char
Copy(
GetMem(
Length(
PAnsiChar(
Pointer(
Seek(
ShortString
string[
代碼中包含上述寫法的地方可能需要修改以適應 UnicodeString 的變化。
帶字符的集合類型
您可能需要修改下列類型:
in AnsiChar> 這樣的代碼生成的程序是正確的(>#255 的字符不會包含在集合內)。編譯器會提出 "WideChar reduced in set Operations" 的警告,基於您代碼的需要,您可以關閉這個警告,或者使用 CharInSet 函數替代。
in LeadBytes 全局的 LeadBytes 變量包含的是本地 MBCS Ansi 字符的集合。UTF-16 格式也有 LeadChar 的概念((#$D800 - #$DBFF 是高 surrogate, #$DC00 - #$DFFF 是低 surrogate)。因此建議使用 overload 函數 IsLeadChar 來判斷,該函數的 ANSI 版本檢測 LeadBytes,WideChar 版本檢測 high/low surrogate。
字符分類 使用靜態類 TCharacter。Character 單元中提供了一些函數對字符分類:IsDigit, IsLetter, IsLetterOrDigit, IsSymbol, IsWhiteSpace, IsSurrogatePair,等等。
應當心這些結構
您需要檢查下列可能引起錯誤的結構:
模糊的類型轉換
AnsiString(Pointer(foo))
檢查正確性:代碼是什麼意圖?
可疑的類型轉換引發的警告
PChar()
PAnsiChar()
直接建立、操作、訪問 string 的內部結構。例如 AnsiString 的內部結構已經發生變化,所以這樣的操作是危險的。您應該使用 StringRefCount, StringCodePage, StringElementSize 等方法來獲得額外信息。
控件和類
TStrings: 內部存儲的是 UnicodeStrings。
TWideString:(可能被廢棄)沒有更改,內部使用 WideString (BSTR)
TStringStream
被重寫成內部存儲 ANSI 字符
字符編碼可以被重載
考慮使用 TStringBuilder 替代 TStringStream 來逐步構建字符串
TEncoding
Default 屬性是用戶活動頁碼(users’ active code page)
支持 UTF-8
支持 UTF-16, big 和 little endian
支持 Byte Order Mark (BOM)
您可以繼承子類實現特殊的編碼
Byte Order Mark
BOM 必須添加到文件中以便判斷文件的編碼方式。
UTF-8 使用 EF BB EF
UTF-16 Little Endian 使用 FF FE
UTF-16 Big Endian 使用 FE FF
做好這些注意事項,將幫助您順利地把舊有項目遷移到 Tiburon 的 Unicode 下。當然,如果您開發的是多版本控件,或者是希望項目能在多個版本中編譯,您最好根據這些特性定義適當的編譯條件,以便讓代碼更好的被更低的版本的編譯器支持和編譯。
本文基於 Tiburon 幫助編寫,如有翻譯錯誤或描述不准確的地方歡迎大家指正!相信這次 Delphi / C++ Builder 2009 將是廣大愛好者最喜歡的版本之一。