我需要將ISO-2022-JP和ISO-2022-JP-2(以及ISO-2022的其他變體)中的一串字節轉換爲Unicode。我正在嘗試使用ICU(link text),但以下代碼無效。C++將字符串編碼爲Unicode - ICU庫
std::string input = "\x1B\x28\x4A" "ABC\xA6\xA7"; //the first 3 chars are escape sequence to use JIS_X201 character set in GL/GR
UErrorCode status = U_ZERO_ERROR;
UConverter *conv;
// set up the converter
conv = ucnv_open("ISO-2022-JP", &status);
if (status != U_ZERO_ERROR) return false; //couldn't find character set
UChar * convDest = new UChar[2*input.length()]; //ucnv_toUChars will use up to 2*length
// convert to Unicode
int resultLen = (int)ucnv_toUChars(conv, convDest, 2*input.length(), input.c_str(), input.length(), &status);
這是行不通的。結果包含'?'我爲之放入的任何東西都是ASCII以上的字符。狀態沒有錯誤。我究竟做錯了什麼?
最重要的是,由於MSVC 9項目不會轉換爲MSVC 10項目,因此我在編譯4.4版庫時遇到問題。
我也知道libiconv開源庫。我無法在Windows上編譯該文件。如果有人對不同的圖書館有任何建議,那也是值得歡迎的。
謝謝。
編輯 最初使用的轉義序列是錯誤的。所以現在ICU接受這個字符串,去掉轉義序列 - 這是朝正確方向邁出的一步。但結果仍然包含'?'字符。
EDIT2我無法轉換到MSVC 10項目的原因是因爲x64平臺沒有安裝(它不是默認情況下)。或者,我可以在文本編輯器中打開所有項目,並刪除所有提及的x64目標。
非常有趣。您是否嘗試使用Java(非ICU)從2022轉換爲Unicode? – 2010-09-20 21:03:50
我試過了:Charset iso2022JP = Charset.forName(「ISO-2022-JP」); CharBuffer result = iso2022JP.decode(ByteBuffer.wrap(bytes));字符集是sun.nio.cs.ext.ISO2022_JP,結果與ICU相同。它基本上不映射128以上的字符。 – Budric 2010-09-21 15:45:51
Budric你可以在http://bugs.icu-project.org/trac/newticket上提交ICU上的錯誤,並提及這些發現?真奇怪,這些都不支持編碼。 – 2010-09-21 19:04:16