我如何确定这是latin1还是utf8?

时间:2011-12-21 20:15:12

标签: c character-encoding

我在latin1表中有一个字符串“Artîsté”。我使用C mysql连接器从表中获取字符串。我将character_set_connection设置为utf8。

在调试器中它看起来像:

"Art\xeest\xe9"

如果我用printf打印十六进制值(“%02X”,(unsigned char)a [i]);对于我得到的每个字符

41 72 74 EE 73 74 E9

我怎么知道它是utf8还是latin1?

2 个答案:

答案 0 :(得分:4)

\x74\xee\x73不是有效的UTF-8序列,因为UTF-8在最高位设置时从不运行1个字节。所以在这两者中,它必须是Latin-1。

但是,如果您看到有效UTF-8数据的字节,那么它并不总是可以排除它可能是Latin-1,恰好也是有效的UTF-8。

Latin-1确实有一些无效字节(ASCII控制字符0x00-0x1F和未使用的范围0x7f-0x9F),因此有一些UTF-8字符串可以肯定不是Latin-1 。但根据我的经验,将Windows CP1252错误地标记为Latin-1是很常见的,拒绝所有这些代码点是相当徒劳的,除非你从另一个charset转换为Latin-1,并且想要严格要求你输出。 CP1252也有一些未使用的字节,但没有那么多。

答案 1 :(得分:1)

你可以在the schema的UTF-8序列中看到,你可以有两个很好的可能性:

  • 第1位= 0(与ascii相同),每个字符1个字节,值<&lt; = 0X7F
  • 第一位= utf-8序列中的1,序列长度> = 2个字节,其值> = 0X80

这是iso-8859编码

41 72 74 *EE* 73 74 *E9*

只有2个独立字节,值为&gt; = 0x80

ADD BEWARE

小心!即使您发现格式良好的UTF-8序列,也无法将其与ISO-8859字符的差异区分开来!