[英]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將在賦值語句中自動轉換為UnicodeString
或AnsiString(x)
,反之亦然。 以前的版本只有一個AnsiString
類型,因此您需要自己跟蹤哪些變量包含UTF-8數據以及哪些變量包含Ansi數據。 (關於變量和參數名稱的匈牙利表示法可以幫助您跟蹤。)當然,還有一個Utf8Decode
函數可以將UTF-8數據轉換回WideString
。
要處理其他字符編碼,您需要查看Open XML ,這是一個免費的Delphi XML庫。 作為XML處理的一部分,它支持轉換70種不同的編碼。
從UTF8使用類型WideString的和編碼功能到/(UTF8Encode / UTF8Decode)
不要使用字符串類型 ,也不要使用Ansi函數 - 如果這樣做,就會丟失信息。
我沒有使用Delphi 2009(在它發布之前)構建了一個完整的unicode應用程序。
我使用了以下內容:
使用widestring作為主字符串數據類型。
使用unicode的已使用的數據庫組件(ADO也使用寬字符串,但我沒有'使用它因為它不處理unicode字段名稱)。
用於UI的免費TNTControls,工作正常,但它與標准控件相同,沒有像其他第三方控件那樣的功能。
我已經設置了一個具有不同語言的VM,因此我可以在不支持我的語言的不同系統中測試該版本。
FastReport是我的報告工具,也支持Unicode。
我也使用Delphi Inspiration的DIConverters將數據庫從ansi轉換為UTI8的功能,你可以用它來轉換/轉換到UTF8,它是免費軟件;-)
還有一個開源項目Delphi基礎 ,它有unicode的usefual功能。
但我認為,如果您可以使用D2009獲得完全支持unicode,那么您的工作將更容易,更快,因為您不會使用慢速寬帶數據類型,並且您會發現大多數第三方提供了Unicode版本或現在正在使用它。
將Delphi 2009之前的應用程序轉換為unicode很困難但可行。 我把它分成3個任務。
最重要的是確保您的測試徹底,並使用實際使用高字節的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.