C++ C++;将字符串编码为Unicode-ICU库
我需要将ISO-2022-JP和ISO-2022-JP-2(以及ISO-2022的其他变体)中的一组字节转换为Unicode。我正在尝试使用ICU(),但是下面的代码不起作用C++ C++;将字符串编码为Unicode-ICU库,c++,c,character-encoding,icu,C++,C,Character Encoding,Icu,我需要将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_ERR
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版库时遇到了麻烦,因为MSVC9项目无法转换为MSVC10项目
我也知道libiconv开源库。我无法在windows上编译这个。如果有人对其他图书馆有任何建议,也欢迎
谢谢
编辑
我最初使用的转义序列是错误的。所以现在ICU拿着绳子,去掉了转义序列——这是朝着正确方向迈出的一步。但结果仍然包含“?”字符
EDIT2我无法转换为MSVC 10项目的原因是没有安装x64平台(默认情况下没有安装)。或者,我可以在文本编辑器中打开所有项目,删除对x64目标的所有提及。这与ISO 2022编码不同。高位应该是零。转义序列看起来有些可识别,但它是从ESC开始的。0x1b,而不是0xb0。不知道这些字节值的真正含义。这与ISO 2022编码不同。高位应该是零。转义序列看起来有些可识别,但它是从ESC开始的。0x1b,而不是0xb0。不知道这些字节值的真正含义。(这个问题看起来很熟悉,大家好。) 次要的、次要的nit:您希望使用
if(U\U失败(状态))
(或者相反,U\U成功(状态)
)检查错误状态 (这个问题看起来很熟悉,大家好。)
次要的、次要的nit:您希望使用
if(U\U失败(状态))
(或者相反,U\U成功(状态)
)检查错误状态 我无法将转换用于ISO-2022-JP编码中的JIS_X201字符集。我不能用任何工具来生成一个“有效”的,我尝试了java(ICU和非ICU的ISO2022实现)和C++。
因此,我基本上只是编写了一个函数来执行代码查找,并使用以下表将其转换为Unicode:
编辑
当我开始填写bug报告时,我想包括ISO-2022-JP的RFC。然后我在RFC中找到了这一行“JIS X 0201的假名集未在ISO-2022-JP消息中使用”。因此,该标准似乎没有实际定义高位。ISO-2022-JP-3将映射上层位,但映射到下层位。因此,我必须获取每个字节并从中减去0x80,然后将其传递给ISO-2022-JP-3,并将其他小于128的字节传递给完整JISx201字符集的ISO-2022-JP转换器。好吧,我自己做就容易多了
所以严格地说,我会说这不是一个错误。但这是一个巨大的头痛
顺便说一句,我试图解码的整个混乱的上行流都来自DICOM。请参阅第107页,了解他们认为可以接受的内容。< P>我不能在ISO-2022-JP编码中转换为JISUX201字符集。我不能用任何工具来生成一个“有效”的,我尝试了java(ICU和非ICU的ISO2022实现)和C++。 因此,我基本上只是编写了一个函数来执行代码查找,并使用以下表将其转换为Unicode: 编辑 当我开始填写bug报告时,我想包括ISO-2022-JP的RFC。然后我在RFC中找到了这一行“JIS X 0201的假名集未在ISO-2022-JP消息中使用”。因此,该标准似乎没有实际定义高位。ISO-2022-JP-3将映射上层位,但映射到下层位。因此,我必须获取每个字节并从中减去0x80,然后将其传递给ISO-2022-JP-3,并将其他小于128的字节传递给完整JISx201字符集的ISO-2022-JP转换器。好吧,我自己做就容易多了 所以严格地说,我会说这不是一个错误。但这是一个巨大的头痛
顺便说一句,我试图解码的整个混乱的上行流都来自DICOM。请参阅第107页,看看他们认为可以接受的内容。逃跑的顺序是错误的。愚蠢的错误。然而,我认为输入字符串对于ISO 2022是正确的。该标准支持8字节编码-这就是为什么有GL和GR平面。同时考虑ISO-2022-JP,给定转义序列,它应该绑定字符集,该字符集确实映射更高的字节。我在ISO-2022中使用了这个参考:第8节描述了8位代码。这是一个完整的编码错误,大概是我见过的最糟糕的。它对解码器状态非常敏感,请确保使用来自已知良好来源的真实数据。如果你没有好的数据,一种方法是先对你期望看到的内容进行编码,然后将其返回到解码器。我完全同意。这绝对是一场噩梦。我会尽力确保我的输入是正确的,你是对的。逃跑的顺序是错误的。愚蠢的错误。然而,我认为输入字符串对于ISO 2022是正确的。该标准支持8字节编码-这就是为什么有GL和GR平面。同时考虑ISO-2022-JP,给定转义序列,它应该绑定字符集,该字符集确实映射更高的字节。我在ISO-2022中使用了这个参考:第8节描述了8位代码。这是一个完整的编码错误,大概是我见过的最糟糕的。它对解码器状态非常敏感,请确保使用来自已知良好来源的真实数据。如果你没有好的数据,一种方法是先对你期望看到的内容进行编码,然后将其返回到解码器。我完全同意。这绝对是一场噩梦。我会尽量确保我的输入是好的。非常有趣。是吗