2011-09-10 105 views
1

據我所知,不同的區域設置有不同的編碼。對於ICU,我想將UnicodeString轉換爲當前的語言環境編碼,然後再轉換回來。具體來說,我使用的是Boost的文件系統庫,它依次使用Windows的UTF-16或Linux的UTF-8編碼。ICU C++轉換編碼

有沒有辦法使用ICU或其他庫可靠地做到這一點?

+1

ICU是一個相當沉重的圖書館,它可能是這個簡單的任務矯枉過正。您可能要考慮Linux上的'libiconv'和Windows上的'WideCharToMultiByte'和'MultiByteToWideChar'。如果你真的想要,也可以使用ICU。 –

+0

啊。我不知道,我只是想在我的應用程序中支持Unicode。 – Jookia

+0

可能重複[ICU UnicodeString到區域設置編碼](http://stackoverflow.com/questions/7370679/icu-unicodestring-to-locale-encoding) – tchrist

回答

2

您可以使用ICU,但您可能會發現足夠多,這對於設置和操作(以及它是Posix的一部分,並且易於在Windows中使用)要簡單得多。

無論使用哪種庫,都必須將Unicode字符串轉換爲寬字符串。在iconv()那個目標叫做WCHAR_T。一旦你有一個寬字符,你可以直接在Windows中使用它。

在Linux中,您可以繼續使用wcstombs()將寬字符轉換爲系統(和語言環境)的窄字符多字節編碼(不要忘記setlocale(LC_CTYPE, "");),或者,如果您確定要使用UTF -8而不是系統的編碼,你可以直接將原始字符串轉換爲UTF-8(也可以使用任何一個庫)。

也許你會發現我的this post提供一些背景。

+0

我將不得不最終爲Unicode的東西做一個字符串類? – Jookia

+0

我只是使用'std :: vector '作爲原始的代碼點字符串,或者'std :: vector ',如果可以的話。還有一個'std :: u32string'(一個'std :: basic_string '的typedef),但是由於你不能寫入字符串的數據緩衝區,矢量更好。當你完成後,你總是可以說'std :: u32string(v.begin(),v.end())' –

+0

找到一個UTF-8字符串庫是否明智?(我懷疑我的問題會比ASCII集,或最高的BMP),然後添加一些iconv的東西呢? – Jookia