我在C中使用iconv.h
将编码从ISO-8859-*
转换为UTF-8
。我需要在浏览器中显示传入的流。但转换后的结果不会显示在chrome中。在其他浏览器中,它正常工作。
下面给出了一个字符串样本
char *str = "\x05\x86\x53";
char dest_str[100];
char *out = dest_str;
size_t inbytes = strlen(str);
size_t outbytes = sizeof dest_str;
printf("Before Conversion: %2x %2x %2x\n",str[0],str[1],str[2]);
iconv_t conv = iconv_open("UTF-8//TRANSLIT", "ISO-8859-9");
if (conv == (iconv_t)-1) {
perror("iconv_open");
return 1;
}
if (iconv(conv, &str, &inbytes, &out, &outbytes) == (size_t)-1) {
perror("iconv");
return 1;
}
dest_str[sizeof dest_str - outbytes] = 0;
printf("After Conversion: %2x %2x %2x\n",dest_str[0],dest_str[1],dest_str[2]);
puts(dest_str);
输出:转化前:5 ffffff86 53
转换后:5 ffffffc2 ffffff86
转换是否正确进行?如何解决chrome中不可显示字符的这个问题?
答案 0 :(得分:0)
据我所见,转换是正确的。唯一的问题是UTF-8字符串有四个字节但你只打印前三个字节。
显然,05是非打印角色。它的含义在投资环境中没有意义。 (为什么要发送它?)可能是Chrome拒绝打印任何包含控制代码的内容。
0x86到0xC2 0x86的转换是正确的。但是,您使用的字体可能没有字形。在我的Mac上,似乎就是这种情况。
修改强>
检出ISO-8859-9后发现您正在翻译的序列包含一个ASCII控制代码(0x05),一个未定义字符(0x86)和一个ASCII可打印字符(0x53或S)。转换为UTF-8会保留ASCII字符(可打印或不打印),但会将非ASCII字符正确转换为UTF-8双字节序列。当你的文字呈现时,你的三个角色中有两个没有意义,Chrome显然拒绝这样做。