0
int main()
{
    char str[200] = {0};
    char out[500] = {0};

    str[0]=0x00; str[1]=0x52; str[2]=0x00; str[3]=0x65; str[4]=0x00; str[5]=0x73; str[6]= 0x00; str[7]=0x74;

    for(int i=0;i<sizeof(str);i++)
    cout<<"-"<<str[i];
    changeCharEncoding("UCS-2","ISO8859-1",str,out,sizeof(out));
    cout<<"\noutput : "<<out;
    for(int i=0;i<sizeof(out);i++)
    cout<<":"<<out[i];
}

//encoding function
int changeCharEncoding(const char *from_charset, const char *to_charset, const char *input, char *output, int out_size)
{
    size_t input_len = 8;
    size_t output_len = out_size;
    iconv_t l_cd;
    if ((l_cd = iconv_open (to_charset, from_charset)) == (iconv_t) -1)
    {
            return -1;
    }
    int rc = iconv(l_cd, (char **)&input, &input_len, (char **)&output, &output_len);
    if (rc == -1)
    {
            iconv_close(l_cd);
            return -2;
    }
    else
    {
            iconv_close(l_cd);
    }
}

请建议我一种将 16 位数据转换为 8 位的方法。我已经使用 iconv 尝试过。如果还有其他事情可以做同样的事情,也建议我。

4

3 回答 3

1

看起来您正在尝试在UTF-16UTF-8编码之间进行转换:尝试将您的调用更改changeCharEncoding()为:

changeCharEncoding("UTF-16","UTF-8",str,out,sizeof(out));

结果UTF-8输出应该是

刀攀猀琀

附带说明:您的代码中有几处您应该考虑改进。例如,两者都changeCharEncodingmain声明为返回一个int,而您的实现则没有。

于 2013-10-11T20:26:30.300 回答
0

我怀疑你有字节序问题:尝试改变这个

changeCharEncoding("UCS-2","ISO8859-1",str,out,sizeof(out));

对此

changeCharEncoding("UCS-2BE","ISO8859-1",str,out,sizeof(out));
于 2013-10-11T20:57:40.473 回答
0

一般来说 - 你不能将任意 16 位数据转换为 8 位数据,你会丢失一些数据

如果您尝试转换编码 - 相同的规则适用,因为您无法将某些符号转换为 8 位 ASCII,因此它们会丢失,对于不同的平台,您可以使用不同的功能:

Windows:WideCharToMultiByte

*nix:iconv

于 2013-10-11T19:48:28.287 回答