在C和C++中處理unicode字符序列的更便捷和乾淨的方法是什麼?如何在C/C++中處理unicode字符序列?
此外,如何:
- 讀取Unicode字符串
- 轉換Unicode字符串爲ASCII節省一些字節(如果用戶僅輸入ASCII)
- 打印Unicode字符串
我應該使用環境嗎?我讀過關於LC_CTYPE的例子,我應該關心它作爲開發人員嗎?
在C和C++中處理unicode字符序列的更便捷和乾淨的方法是什麼?如何在C/C++中處理unicode字符序列?
此外,如何:
- 讀取Unicode字符串
- 轉換Unicode字符串爲ASCII節省一些字節(如果用戶僅輸入ASCII)
- 打印Unicode字符串
我應該使用環境嗎?我讀過關於LC_CTYPE的例子,我應該關心它作爲開發人員嗎?
如果適合,您需要閱讀,打印或將Unicode轉換爲ASCII碼?只需使用UTF-8,所有這些對你來說都是絕對透明的。
的/子集的文本分析處理利用好圖書館像ICU,Boost.Locale甚至Qt的,油嘴,讓相當良好的文本分析/處理工具。
在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 std :: wstring!= ** ** Unicode字符串; std :: string是完全的Unicode字符串作爲std :: wstring! – Artyom 2010-09-02 04:47:16
我沒有說'std :: wstring'是Unicode。 – dirkgently 2010-09-02 04:48:48
我的意思是這樣的:'std :: wstring'可以用於UTF16(在Windows)和UTF32(在Mac/Linux上)。 UTF8最大的問題在於它是一種可變寬度編碼,因此'char'或'wchar_t' *可能無法代表跨平臺的Unicode字符。 – dirkgently 2010-09-02 05:02:46
什麼是更輕便和清潔 的方式來處理Unicode字符 序列C和C++?
程序中的所有字符串都是UTF-8, UTF-16, or UTF-32。如果由於某種原因需要使用非Unicode編碼,請在輸入和輸出上進行轉換。
讀unicode字符串
你閱讀的ASCII文件一樣。但是仍然有很多非Unicode數據,因此您需要檢查數據是否爲 Unicode。如果不是(或者如果您的首選內部編碼爲UTF-32,則爲UTF-8),則需要對其進行轉換。
轉換Unicode字符串以ASCII到 節省一些字節(如果用戶僅輸入 ASCII)
不要。如果您的數據全部是ASCII碼,那麼UTF-8將佔用完全相同的空間量。如果不是,當你轉換成ASCII碼時,你將失去信息。如果你關心保存字節。
打印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。
出色的概述,尤其是因爲它避免了任何編程語言特定的東西 – 2010-09-02 06:57:56
在這之前寫了一些很好的答案,但沒有一個提到我認爲可能的問題,因爲這個問題也有C
標籤。我的C知識已經過時,如果我錯了,請糾正我的錯誤。
請注意,大概爲零終止的字符串,傳統的C字符串函數和UTF-16編碼的數據流可能是一個棘手的組合,因爲在UTF-16中,許多西方字母數字字符將被編碼爲兩個字節,其他字節全部爲零因此將字符數據讀作char
系列並不像以前那樣使用單字節字符集。
您可以使用帶有UTF-16的0x0000終止的字符串。 ICU(上面提到)非常廣泛地支持這一點。正如你所說,你不能假定UTF-16適合8位字符。 – 2010-09-08 20:31:53
相關http://stackoverflow.com/questions/3613149/3614105#3614105 – dan04 2010-09-02 03:56:23