簡體   English   中英

C ++將字符串編碼為Unicode-ICU庫

[英]C++ encode string to Unicode - ICU library

我需要將ISO-2022-JP和ISO-2022-JP-2(以及ISO-2022的其他變體)中的一堆字節轉換為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。 狀態沒有錯誤。 我究竟做錯了什么?

最重要的是,我在編譯版本4.4的庫時遇到了麻煩,因為MSVC 9項目無法轉換為MSVC 10項目。

我也知道libiconv開源庫。 我無法在Windows上編譯該代碼。 如果有人對其他庫有任何建議,也歡迎您。

謝謝。

編輯我最初使用的轉義序列是錯誤的。 因此,現在ICU提取字符串,去除轉義序列-這是朝正確方向邁出的一步。 但是結果仍然包含“?” 字符

EDIT2之所以無法轉換為MSVC 10項目,是因為未安裝x64平台(默認情況下未安裝)。 或者,我可以在文本編輯器中打開所有項目,並刪除所有提及x64 target的內容。

這與ISO 2022編碼不同。 高位假定為零。 轉義序列看起來有些可識別,但以ESC開頭。 0x1b,而不是0xb0。 不知道這些字節值的真正含義是什么。

(這個問題看起來很熟悉,再次問好。)

次要,次要:您想使用if(U_FAILURE(status)) (或相反, U_SUCCESS(status) )檢查錯誤狀態。

我無法使用ISO-2022-JP編碼的JIS_X201字符集進行轉換。 而且,我無法使用任何可用的工具來生成“有效”的工具-嘗試使用Java(ICU和ISO2022的非ICU實現)和C ++。

因此,我基本上只是編寫了一個函數來執行代碼查找,並使用此表轉換為Unicode: Wikipedia

編輯當我開始填寫錯誤報告時,我想包括ISO-2022-JP的RFC。 然后,我在RFC“ ISO-2022-JP消息中未使用JIS X 0201的假名集”中發現了這一行。 鏈接文字 因此看來,該標准實際上並未定義高位。 ISO-2022-JP-3將映射高位,但映射到低位。 因此,我必須將每個字節減去0x80,然后通過ISO-2022-JP-3,然后將其他字節<128,然后通過ISO-2022-JP轉換器,以獲得完整的JIS_X201字符集。 好吧,自己動手做要容易得多。

因此嚴格來說,我會說這不是錯誤。 但是,這是一個巨大的頭痛。

PS我要解碼的整個混亂流都來自DICOM。 請參閱pdf第107頁,了解他們認為可接受的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM