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。还建议我是否有其他事情要做同样的事情。
答案 0 :(得分:1)
您似乎尝试在UTF-16
和UTF-8
编码之间进行转换:
尝试将changeCharEncoding()
的来电更改为:
changeCharEncoding("UTF-16","UTF-8",str,out,sizeof(out));
生成的UTF-8
输出应为
刀攀猀琀
旁注:您的代码中有几件事情应该考虑改进。例如,changeCharEncoding
和main
都声明为返回int
,而您的实现则不会。
答案 1 :(得分:0)
一般来说 - 你不能将任意16位数据转换成8位数据,你会丢失一些数据
如果您正在尝试转换编码 - 同样的规则适用,因为您无法将某些符号转换为8位ASCII,因此它们将丢失,对于不同的平台,您可以使用不同的功能:
Windows:WideCharToMultiByte
* nix:iconv
答案 2 :(得分:0)
我怀疑你有一个字符串问题:尝试更改此
changeCharEncoding("UCS-2","ISO8859-1",str,out,sizeof(out));
到这个
changeCharEncoding("UCS-2BE","ISO8859-1",str,out,sizeof(out));