2010-09-15 89 views
1

我需要將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目標。

回答

1

我無法使用ISO-2022-JP編碼中的JIS_X201字符集進行轉換。我無法使用任何可用的工具生成「有效的」 - 嘗試Java(ICU和非ICU實施ISO2022)和C++。

所以我基本上只是寫了一個函數來執行代碼查找並使用此錶轉換爲Unicode:wikipedia

編輯 當我開始填寫錯誤報告時,我想包括ISO-2022-JP的RFC。然後我在RFC中找到了這條線「ISO 2022-JP消息中沒有使用JIS X 0201的假名集。」 link text。所以看起來標準並沒有實際定義高位。 ISO-2022-JP-3將映射高位,但映射到低平面。因此,我必須取每個字節並從中減去0x80,並通過ISO-2022-JP-3,並將其他字節< 128傳遞給ISO-2022-JP轉換器以獲得完整的JIS_X201字符集。那麼只需要自己做就容易多了。

嚴格來說,我會說這不是一個錯誤。儘管這很令人頭痛。

P.S.我試圖解碼的整個錯誤來自DICOM。請參閱pdf第107頁以瞭解他們認爲可接受的內容。

+0

非常有趣。您是否嘗試使用Java(非ICU)從2022轉換爲Unicode? – 2010-09-20 21:03:50

+0

我試過了: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

+0

Budric你可以在http://bugs.icu-project.org/trac/newticket上提交ICU上的錯誤,並提及這些發現?真奇怪,這些都不支持編碼。 – 2010-09-21 19:04:16

3

這不像ISO 2022編碼。高位應該是零。轉義序列看起來有點可識別,但它以ESC開頭。 0x1b,而不是0xb0。不知道這些字節值的真正含義。

+1

你說得對。轉義序列是錯誤的。愚蠢的錯誤。但是,我認爲輸入字符串對於ISO 2022是正確的。該標準支持8字節編碼 - 這就是爲什麼您有GL和GR平面。同時在http://en.wikipedia.org/wiki/ISO/IEC_2022上查看ISO-2022-JP,如果考慮到轉義序列,它應該綁定http://en.wikipedia.org/wiki/JIS_X_0201字符集,映射更高的字節。我使用ISO-2022的這個參考文獻:http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-035.pdf第8節描述了8位代碼。 – Budric 2010-09-15 20:56:26

+1

這是一個完整的編碼問題,關於我見過的最差的。它對解碼器狀態非常敏感,請確保您使用來自已知良好來源的*真實*數據。如果你沒有好的數據,一種方法是*編碼*你期望首先看到的東西,然後將其推回到解碼器。 – 2010-09-15 21:10:25

+0

我完全同意。一個絕對的噩夢來處理。我會盡力確保我的投入是好的。 – Budric 2010-09-15 21:18:25

1

(這個問題看起來很熟悉,喜試。)

A小調小的尼特:您是否希望if(U_FAILURE(status))檢查錯誤狀態(或者相反,U_SUCCESS(status))。

相關問題