2010-09-02 33 views
11

在C和C++中處理unicode字符序列的更便捷和乾淨的方法是什麼?如何在C/C++中處理unicode字符序列?

此外,如何:

- 讀取Unicode字符串

- 轉換Unicode字符串爲ASCII節省一些字節(如果用戶僅輸入ASCII)

- 打印Unicode字符串

我應該使用環境嗎?我讀過關於LC_CTYPE的例子,我應該關心它作爲開發人員嗎?

+0

相關http://stackoverflow.com/questions/3613149/3614105#3614105 – dan04 2010-09-02 03:56:23

回答

0

如果適合,您需要閱讀,打印或將Unicode轉換爲ASCII碼?只需使用UTF-8,所有這些對你來說都是絕對透明的。

  • 閱讀,寫作沒有區別
  • ASCII已經是UTF-8

的/子集的文本分析處理利用好圖書館像ICU,Boost.Locale甚至Qt的,油嘴,讓相當良好的文本分析/處理工具。

3

在C和C++中處理unicode字符序列的更方便和乾淨的方法是什麼?

使用庫如ICU。如果你不能,那是令人生畏的,而不是你自己的。儘管如此,準備好艱難時期。另外,請查閱關於示例源代碼的gg文檔。

我也應該使用環境嗎?

是。您可能還需要使用std::setlocale函數。這將允許您設置與您想要的編碼相對應的語言環境,例如如果你想使用英式英語作爲一種語言,並使用UTF-8作爲編碼,你可以使用set LC_CTYPE to en_GB.UTF8

C++ 03不給你一個處理Unicode的方法。您最好的選擇是使用wchar_t數據類型(和擴展std::wstring)。但是請注意,不同操作系統上的大小和字符編碼是不同的。例如。 Windows爲wchar_t和UTF-16編碼使用2個字節,而GNU/Linux和Mac OSX使用4個字節和UTF-32。

C++ 0x應該通過允許Unicode文字codecvt方面,C Unicode TR支持(讀取<uchar.h>)等來修改情況,但對於大多數編譯器來說,這是很長的路。 (這裏有上,這樣應該可以幫助您開始的一些問題。)

+1

-1 std :: wstring!= ** ** Unicode字符串; std :: string是完全的Unicode字符串作爲std :: wstring! – Artyom 2010-09-02 04:47:16

+1

我沒有說'std :: wstring'是Unicode。 – dirkgently 2010-09-02 04:48:48

+0

我的意思是這樣的:'std :: wstring'可以用於UTF16(在Windows)和UTF32(在Mac/Linux上)。 UTF8最大的問題在於它是一種可變寬度編碼,因此'char'或'wchar_t' *可能無法代表跨平臺的Unicode字符。 – dirkgently 2010-09-02 05:02:46

8

什麼是更輕便和清潔 的方式來處理Unicode字符 序列C和C++?

程序中的所有字符串都是UTF-8, UTF-16, or UTF-32。如果由於某種原因需要使用非Unicode編碼,請在輸入和輸出上進行轉換。

讀unicode字符串

你閱讀的ASCII文件一樣。但是仍然有很多非Unicode數據,因此您需要檢查數據是否爲 Unicode。如果不是(或者如果您的首選內部編碼爲UTF-32,則爲UTF-8),則需要對其進行轉換。

  • 通過驗證可以可靠地檢測到UTF-8和UTF-32。
  • UTF-16可以通過BOM的存在來檢測。
  • 如果它不是UTF編碼,它可能在ISO-8859-1或windows-1252中。

轉換Unicode字符串以ASCII到 節省一些字節(如果用戶僅輸入 ASCII)

不要。如果您的數據全部是ASCII碼,那麼UTF-8將佔用完全相同的空間量。如果不是,當你轉換成ASCII碼時,你將失去信息。如果你關心保存字節。

  • 選擇最佳的UTF編碼。對於字符U + 0000到U + 007F,UTF-8是最小的。對於字符U + 0800到U + FFFF,UTF-16是最小的。
  • 使用像gzip這樣的數據壓縮。有專爲Unicode設計的SCSU編碼,但我不知道它有多好。

打印unicode字符串

編寫UTF-8是沒有從寫ASCII不同。

除了在Windows命令提示符下,因爲它仍然使用舊的「OEM」代碼頁。在那裏你可以使用帶有UTF-16字符串的WriteConsoleW

我也應該使用環境嗎? 我讀過關於LC_CTYPE的例子, 我是否應該關心它作爲開發人員 ?

LC_CTYPE是從每個語言都有自己的字符編碼,因此它自己的ctype.h函數的保留。今天,Unicode Character Database負責照顧。 Unicode的優點在於它將分開字符編碼處理和語言環境處理(立陶宛語,土耳其語和阿塞拜疆語的special uppercase/lowercase rules除外)。

但是每種語言仍然有它自己的整理規則和數字格式規則,所以你仍然需要這些規則的語言環境。您需要將您的區域設置的字符編碼設置爲UTF-8。

+1

出色的概述,尤其是因爲它避免了任何編程語言特定的東西 – 2010-09-02 06:57:56

0

在這之前寫了一些很好的答案,但沒有一個提到我認爲可能的問題,因爲這個問題也有C標籤。我的C知識已經過時,如果我錯了,請糾正我的錯誤。

請注意,大概爲零終止的字符串,傳統的C字符串函數和UTF-16編碼的數據流可能是一個棘手的組合,因爲在UTF-16中,許多西方字母數字字符將被編碼爲兩個字節,其他字節全部爲零因此將字符數據讀作char系列並不像以前那樣使用單字節字符集。

+0

您可以使用帶有UTF-16的0x0000終止的字符串。 ICU(上面提到)非常廣泛地支持這一點。正如你所說,你不能假定UTF-16適合8位字符。 – 2010-09-08 20:31:53

相關問題