【问题标题】:iconv conversion to UTF-8 results in non displayable charactersiconv 转换为 UTF-8 导致不可显示的字符
【发布时间】:2017-03-09 12:09:20
【问题描述】:

我在 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中无法显示字符的问题?

【问题讨论】:

  • 你希望展示什么?

标签: html c encoding utf-8 iconv


【解决方案1】:

据我所知,转换是正确的。唯一的问题是 UTF-8 字符串有四个字节,但您只打印前三个字节。

显然,05 是非打印字符。它的含义在浏览器上下文中没有意义。 (为什么要发送它?)可能是 Chrome 拒绝打印任何包含控制代码的内容。

0x86 到 0xC2 0x86 的转换是正确的。但是,您使用的字体可能没有字形。在我的 Mac 上,情况似乎就是这样。

编辑

检查ISO-8859-9 后发现,您正在翻译的序列包含一个 ASCII 控制码 (0x05)、一个未定义字符 (0x86) 和一个 ASCII 可打印字符(0x53 或 S)。转换为 UTF-8 不会影响 ASCII 字符(可打印或不可打印),但会将非 ASCII 字符正确转换为 UTF-8 两字节序列。三分之二的字符在呈现为文本时没有意义,Chrome 显然拒绝这样做。

【讨论】:

  • 转换是如何发生的?我希望在向浏览器发送数据之前删除控制字符。因此,我是否必须从字符串中删除两个字节的数据而不是一个,即 0xC2 0x86?
  • C2 86 不是控制字符,它是多字节 UTF-8 字符。 05 是一个控制字符,应该删除。
  • 字符从 0 -31 到 127 tp 159 属于控制字符类别 link U+0086 实际上被声明为选定区域
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
  • 2013-11-14
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
相关资源
最近更新 更多