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

时间:2017-07-07 12:34:46

标签: c++ utf-8 iconv

我正在尝试将 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函数都没有抛出任何错误。

任何人都可以帮我弄清楚我在这里遗失了什么吗?

2 个答案:

答案 0 :(得分:0)

您可以使用utfcpp库:http://utfcpp.sourceforge.net/或Boost.Locale用于此目的

答案 1 :(得分:-1)

这是iconv的错误,因为0xc2 0x80code point U+0080 glyph <control>的有效utf-8序列。

此字形经常被误认为UTF-8中编码为0xe2 0x82 0xac的{​​{3}}。