2010-02-24 46 views
16

假設我們有一個任意字符串,sUnicode - 通常在C++中使用它

s具有來自世界上任何地方的屬性。來自美國,日本,韓國,俄羅斯,中國和希臘的人都會不時寫下s。幸運的是,我們沒有時間旅行者使用線性A。

對於就事論事,讓我們假設我們想要做的字符串操作,如:

  • 反向
  • 長度
  • 利用
  • 小寫
  • 指數爲

,只是因爲這是爲了討論的緣故,讓我們假設我們想自己編寫這些例程(而不是抓取庫),我們沒有遺留的軟件來維護。

Unicode有三種標準:utf-8,utf-16和utf-32,每種標準都有優缺點。但是讓我們說我很愚蠢,我想要一個Unicode來統一它們(因爲爲3種不同類型的字符串編碼動態調整庫,以隱藏與API用戶的差異聽起來很難)。

  • 哪種編碼最通用?
  • wchar_t支持哪種編碼?
  • STL支持哪種編碼?
  • 這些編碼是否全部(或根本不)以空值終止?

-

這個問題的關鍵是要教育自己和他人的Unicode有用的和可用的信息:在閱讀的RFC是好的,但有一個相關的編譯器,語言信息「棧」 ,以及RFC未涵蓋的操作系統,但知道在真實應用程序中實際使用Unicode至關重要。

+0

不完全是一個笨蛋,但也閱讀http://stackoverflow.com/questions/114611/what-is-the-best-unicode-library-for-c – 2010-02-24 17:17:06

+0

@Martin:我真的不感興趣 - 在這時間 - 最好的圖書館是什麼。我更感興趣的是讓自己瞭解關於Unicode的一般信息,以及我將如何着手編寫一個反向的程序 - 或者可能是一個比較模糊的例程 - 以Unicode編碼,而不是讓它在土耳其爆炸。 :-) – 2010-02-24 17:25:25

+0

是的,這就是爲什麼我沒有關閉作爲愚蠢的,但有人誰發現這個問題可能只是使用圖書館感興趣。如果這個線程得到很好的答案,我會在另一個線程中交叉引用它。 – 2010-02-24 18:13:07

回答

9
  1. 哪種編碼是最普遍的
    也許UTF-32,儘管所有三種格式可以存儲任何字符。 UTF-32具有每個字符都可以在一個碼點中編碼的屬性。

  2. 哪種編碼由wchar_t的
    都沒有支撐。這是實現定義的。在大多數Windows平臺上,它是UTF-16,在大多數Unix平臺上它的UTF-32。

  3. 哪種編碼由STL
    真的支持。STL可以存儲任何你想要的字符類型。只需使用尺寸足夠大的std::basic_string<t>模板來保存您的代碼點。大多數操作(例如std::reverse)不知道任何類型的unicode編碼。

  4. 難道這些編碼全部(或者根本沒有)空值終止?
    不可以。在任何這些編碼中,Null都是合法的值。從技術上講,NULL也是純ASCII的合法字符。 NULL終止是一件C事 - 不是編碼的事情。

選擇如何做到這一點與您的平臺有很大關係。如果您使用的是Windows,請使用UTF-16和wchar_t字符串,因爲這是Windows API用來支持unicode的原因。我不完全確定UNIX平臺的最佳選擇,但我確實知道它們中的大多數都使用UTF-8。

+2

即使使用UTF-32,也不能將每個字符存儲爲單個代碼點。該編碼只是確保代碼單元和代碼點之間的1:1映射(有關術語的詳細信息,請查看unicode.org) – 2010-02-24 18:15:15

+0

Err ..實際上,它可以。 Unicode需要21位用於全套字符。 UTF-32在單個代碼點提供32位。字符應該永遠不需要在UTF-32上分割。你在考慮UTF-16。 – 2010-02-24 18:33:52

+3

你在這裏討論的是代碼點,而不是字符。無論編碼如何,一些(實際上很多)字符都需要用多個代碼點來描述。看看這個鏈接,例如:http://www.unicode.org/faq/char_combmark.html – 2010-02-24 18:40:24

5

看一看開源庫ICU,特別是在Docs & Papers section。這是一個廣泛的圖書館,處理各種各樣的unicode古怪。

+1

OP明確要求提供非庫答案。 – 2010-02-24 18:31:44

+2

這就是爲什麼我提到他們的文檔和論文部分。如果OP真的想要學習unicode處理,他不應該忽視現有的解決方案。 ICU不僅提供生產級源代碼,還提供設計文檔。 – 2010-02-24 22:49:33

+0

啊 - 我明白了。然後+1。 – 2010-02-25 13:39:11

1

定義「真正的應用程序」 :)

嚴重的是,真正決定取決於你正在開發的這種軟件很多。如果你的目標平臺是Win32 API(帶或不帶包裝如MFC,WTL等),你可能想要使用wstring類型的文本編碼爲UTF-16。這僅僅是因爲所有Win32 API在內部都使用該編碼。另一方面,如果你的輸出是類似於XML/HTML和/或需要通過互聯網傳送的信息,UTF-8幾乎是標準 - 它通常通過協議來傳輸,這些協議對字符進行假設8位。對於UTF-32,除非您需要代碼單元和代碼點之間的1:1映射(這並不意味着代碼單元和代碼單元之間的1:1映射),否則我想不出使用它的唯一原因。字符!)。

欲瞭解更多信息,請務必查看Unicode.org。 This FAQ可能是一個很好的起點。

+0

我不清楚的一件事:任何UTF編碼都可以代表今天所有活着的語言文字中使用的所有字形嗎?也就是說,如果我選擇UTF-8或UTF-16,我會將自己鎖定在某些市場之外嗎? – 2010-02-24 18:41:12

+2

@Paul。 UTF-8,UTF-16和UTF-32描述完全相同的數據(Unicode代碼點),只有不同的編碼方式,嚴格來說,您可以使用它們中的任何一個來存儲Unicode標準覆蓋的任何文本(涵蓋所有生活語言) 。話雖如此,您需要考慮非技術性問題:例如,即使標準的Unicode編碼格式也包含中文字母,中國也要求使用GB18030。 – 2010-02-24 18:46:21

2

爲了響應您的最終項目符號,UTF-8保證其編碼中的任何字符(當然除NULL本身)都不含NULL字節。因此,許多使用以NULL結尾的字符串的函數也適用於UTF-8編碼的字符串。