Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;将字符串编码为Unicode-ICU库_C++_C_Character Encoding_Icu - Fatal编程技术网

C++ C++;将字符串编码为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

我需要将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版库时遇到了麻烦,因为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位代码。这是一个完整的编码错误,大概是我见过的最糟糕的。它对解码器状态非常敏感,请确保使用来自已知良好来源的真实数据。如果你没有好的数据,一种方法是先对你期望看到的内容进行编码,然后将其返回到解码器。我完全同意。这绝对是一场噩梦。我会尽量确保我的输入是好的。非常有趣。是吗