使用 iconv 进行 UTF8 转换的输出不正确



我正在尝试将ISO-8859-1 编码的字符串转换为 Linux 上的 UTF-8。我正在使用iconv函数在 C++ 中做到这一点。这是我的代码:

//Conversion from ISO-8859-1 to UTF-8
iconv_t cd = iconv_open("UTF-8","ISO-8859-1");
char *input = "€"; // the byte value is 128 in ISO-8859-1
char *inputbuf= input;
size_t inputSize=1;
char *output = (char*)malloc(inputSize*4); // maximum size of a character in UTF8 is 4
char *outputbuf = output;
size_t outputSize = inputSize*4;
//Conversion Function
iconv (cd, &inputbuf, &inputSize, &outputbuf, &outputSize);
//Display input bytes(ISO-8859-1)
cout << "input bytes(ISO-8859-1):"
for (int i=0; i<inputSize; i++)
{
cout <<(int) *(input+i) << ", ";
}
cout<< std::endl;
//Display Converted bytes(UTF-8)
cout << "output bytes(UTF-8):"
for (int i=0; i<outputSize; i++) //displaying all the 4 bytes allocated
{
cout <<(int) *(output+i) << ", ";
}
cout<< std::endl;
iconv(cd);

这是我观察到的输出:

input bytes(ISO-8859-1): 128
output bytes(UTF-8): 194, 128, 0, 0

如您所见,输出 UTF-8 转换后的字节为 194,128。但是,预期的 UTF-8 输出为 226,130,172。我验证了任何 iconv 函数都没有抛出错误。

谁能帮我弄清楚我是否在这里遗漏了什么?

您可以使用utfcpp library: http://utfcpp.sourceforge.net/或Boost.Locale来实现此目的

这是iconv的一个错误,因为0xc2 0x80是字形的代码点U+0080的有效utf-8序列。

此字形经常被误认为是字形EURO SIGN,代码点U+20ACUTF-8 编码为0xe2 0x82 0xac

最新更新