2011-09-21 52 views
2

我讀過Stroustrup的Appendix D(特別要注意區域設置和的codecvt)。 Stroustrup沒有給出一個好的代碼和範例(恕我直言)。我一直在試圖從互聯網上旋轉東西,沒有任何快樂。我也嘗試灌輸stringstreams沒有成功。字符串轉換爲wstring的,編碼問題

會有人能夠顯示(和解釋)的代碼從UTF-8去一個UTF-16(或UTF-32)編碼? 注:我不知道輸入/輸出字符串的大小提前,所以我想到了解決辦法應該使用reserveback_inserter。請不要使用out.resize(in.length()*2)

完成後,這將是巨大的,如果代碼實際工作(其驚人的多少斷碼就在那裏)。請確保以下'往返'。以下字節是UTF-8和UTF- {16 | 32}中'bone'的漢字。

const std::string n("\xe9\xaa\xa8"); 
const std::wstring w = L"\u9aa8"; 

我對一個基本問題表示歉意。在Windows上,我使用Win32 API,並且在編碼之間沒有這些問題。

+4

沒有什麼可言,指出'wstring'必須是UTF-16(在Unix上,例如,'wchar_t'通常32位的)。因此,這本書沒有具體解決UTF-16的問題。此外,由於星體字符,您需要專門處理UTF-16中的代理對,並確保它們正確地轉換爲4字節的UTF-8序列(反之亦然)。 –

+0

同意Chris(「沒有什麼說wstring必須是UTF-16」)。我相信唯一需要的是wchar_t至少是8位。對於什麼是值得的,我不在乎它的4,8或10個字節 - 我只是想要它轉換。 – jww

回答

2

他吸食雜草似乎很明顯。至於代碼頁轉換,請看看iconv

+0

我非常接近移動到libiconv。 libiconv不在我的Fedora 14盒子上(儘管它在我的Ubuntu 10盒子上)。我不想通過讓用戶安裝一堆額外的庫來折磨用戶。 (相反,我在折磨自己......)。 – jww

+2

@noloader:libiconv的功能內置於GNU libc中。所以所有的Linux系統都應該已經有了。 –

4

只需使用UTF8-CPP

std::wstring conversion; 
utf8::utf8to16(utf8_str.begin(), utf8_str.end() , back_inserter(conversion)); 

警告:這隻會在哪裏工作wchar_t的是2個字節長(窗口)。

對於便攜式解決方案,你可以這樣做:

std::vector<unsigned short> utf16line; // uint16_t if you can 
utf8::utf8to16(utf8_line.begin(), utf8_line.end(), back_inserter(utf16line)); 

但隨後你失去繩支架。希望我們很快就能獲得char16_t。

+2

+1:是的,請,這需要使用更多。我見過的用於轉換爲UTF編碼的最佳C++庫。 –

+0

Anno - UTFCPP看起來不錯。它以我期望的方式縮小(UTF-8)和寬度(UTF- {16 | 32})。但是,它似乎缺少移入/移出當前語言環境和UTF的功能。你可否確認? – jww

+1

是的,不支持其他形式的編碼。 – anno