1

我需要将 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 目标。

4

3 回答 3

3

这与 ISO 2022 编码不同。高位应该为零。转义序列看起来有点可识别,但它以 ESC 开头。0x1b,而不是 0xb0。不知道这些字节值的真正含义。

于 2010-09-15T20:34:40.163 回答
1

(这个问题看起来很眼熟,你好。)

次要的,次要的 nit:您想使用if(U_FAILURE(status))(或相反,U_SUCCESS(status))检查错误状态。

于 2010-09-16T01:03:54.497 回答
1

我无法使转换适用于 ISO-2022-JP 编码中的 JIS_X201 字符集。而且我无法使用我可以使用的任何工具生成一个“有效”的工具——尝试过 Java(ISO2022 的 ICU 和非 ICU 实现)和 C++。

所以我基本上只是编写了一个函数来进行代码查找并使用此表转换为 Unicode:wikipedia

编辑 当我开始填写错误报告时,我想包括 ISO-2022-JP 的 RFC。然后我在 RFC “The Kana set of JIS X 0201 is not used in ISO-2022-JP messages”中找到了这一行。链接文本。所以看起来标准实际上并没有定义高位。ISO-2022-JP-3 将映射高位,但映射到低平面。所以我必须取出每个字节并从中减去 0x80,然后将其通过 ISO-2022-JP-3,然后将其他小于 128 的字节通过 ISO-2022-JP 转换器,以获得完整的 JIS_X201 字符集。好吧,自己做会容易得多。

所以严格来说,我会说这不是一个错误。虽然这是一个巨大的头痛。

PS我试图解码的整个混乱流来自DICOM。请参阅pdf第 107 页,了解他们认为可以接受的内容。

于 2010-09-20T14:52:16.080 回答