簡體   English   中英

在Delphi版本中處理Unicode字符串<= 2007

[英]Handling a Unicode String in Delphi Versions <= 2007

背景:這個問題涉及2009年以下的Delphi版本(即沒有內置的Unicode支持)。 我有一個規范,要求我通過TCP連接傳輸Unicode編碼的字符串,但我沒有Delphi 2009。

問題是否有單個函數或非常小的庫(我不需要太大的批量),我可以使用它在發送電報之前立即將單個字符串編碼為UTF-8? 作為我的問題的第二部分:如果有UTF-8編碼的字符串作為響應被發回,我想我將需要另一個函數將其恢復為Delphi字符串格式。 我以這種方式理解這種Unicode支持的局限性。

Delphi 2009之前的Delphi版本確實內置了Unicode支持。自從Delphi 4以來, WideString類型已經可用,我想也許更早。 WideString不如新的UnicodeString類型好,但它仍然保存16位Unicode字符,您可以將其輸入到PWideChar以將字符串發送到Unicode API函數。 Windows單元聲明了API函數的大多數“寬”版本,如果你發現一些缺失,沒有什么可以阻止你自己聲明其他函數。

以前的版本沒有VCL中的Unicode支持。 為此,您可以使用Tnt Unicode控件 他們曾經是自由的。 看起來有一些地方仍然可以獲得最新的免費版本: (1)(2)

JCL有兩個用於處理Unicode的單元。 JclWideStrings單元主要具有輕量級實用功能。 JclUnicode單元更完整,但它還包含一個相當大的資源,用於確定所有Unicode字符的字符屬性。

使用JCL,您可以選擇幾種類來保存WideString值列表。 我認為Delphi 7甚至還附帶了一個類。

不要以為僅僅因為你沒有Delphi 2009就無法編寫Unicode程序。

如果您有WideString值,並且想要將其編碼為UTF-8,則調用Utf8Encode函數。 如果您的Delphi版本聲明該類型,它將返回AnsiString值,或者可能Utf8String 但它與Delphi 2009的Utf8String類型不同。 Delphi 2009將在賦值語句中自動轉換為UnicodeStringAnsiString(x) ,反之亦然。 以前的版本只有一個AnsiString類型,因此您需要自己跟蹤哪些變量包含UTF-8數據以及哪些變量包含Ansi數據。 (關於變量和參數名稱的匈牙利表示法可以幫助您跟蹤。)當然,還有一個Utf8Decode函數可以將UTF-8數據轉換回WideString

要處理其他字符編碼,您需要查看Open XML ,這是一個免費的Delphi XML庫。 作為XML處理的一部分,它支持轉換70種不同的編碼。

從UTF8使用類型WideString的和編碼功能到/(UTF8Encode / UTF8Decode)

不要使用字符串類型 ,也不要使用Ansi函數 - 如果這樣做,就會丟失信息。

我沒有使用Delphi 2009(在它發布之前)構建了一個完整的unicode應用程序。

我使用了以下內容:

  1. 使用widestring作為主字符串數據類型。

  2. 使用unicode的已使用的數據庫組件(ADO也使用寬字符串,但我沒有'使用它因為它不處理unicode字段名稱)。

  3. 用於UI的免費TNTControls,工作正常,但它與標准控件相同,沒有像其他第三方控件那樣的功能。

  4. 我已經設置了一個具有不同語言的VM,因此我可以在不支持我的語言的不同系統中測試該版本。

  5. FastReport是我的報告工具,也支持Unicode。

我也使用Delphi Inspiration的DIConverters將數據庫從ansi轉換為UTI8的功能,你可以用它來轉換/轉換到UTF8,它是免費軟件;-)

還有一個開源項目Delphi基礎 ,它有unicode的usefual功能。

但我認為,如果您可以使用D2009獲得完全支持unicode,那么您的工作將更容易,更快,因為您不會使用慢速寬帶數據類型,並且您會發現大多數第三方提供了Unicode版本或現在正在使用它。

將Delphi 2009之前的應用程序轉換為unicode很困難但可行。 我把它分成3個任務。

  1. 首先,確保您的數據庫處理unicode字符串。 最好是UTF-16支持。 確保所有數據庫代碼都正確處理寬字符串,並且您使用的驅動程序也可以正常處理。
  2. 將所有業務邏輯從使用字符串轉換為使用WideStrings。 很容易錯過一些,你不會得到任何錯誤,因為如果忘記任何方法,編譯器將隱式地將寬字符串轉換為字符串。 還要確保將所有標准字符串函數更改為WideString等效函數。 此過程需要擴展到您可能使用的任何第三部分組件。
  3. 最后一部分是將您可能擁有的標准和第三方可視組件更改為WideString等效組件。 這需要在顯示可能包含unicode字符的字符串的地方完成。

最重要的是確保您的測試徹底,並使用實際使用高字節的unicode字符。 如果您只是使用拉丁字符集測試,您將錯過錯誤。

如果您需要做的只是將程序內部字符串從系統編碼轉換為UTF-8並返回,那么請使用Uwe Raabe提到的庫函數。 如果你仍然使用Delphi 4或5(沒有這些功能),你可以使用Delphi的GNU gettext中的函數。

並且不要讓所有關於完全使用WideString的答案嚇到你 - 使用UTF-8作為數據交換的編碼(這是我理解你的問題)應該可以在正常的Ansi Delphi程序中實現而不會出現大問題,只要您正在處理Windows編碼中100%可表示的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM