我在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?
答案 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序列中看到,你可以有两个很好的可能性:
这是iso-8859编码
41 72 74 *EE* 73 74 *E9*
只有2个独立字节,值为> = 0x80
ADD BEWARE
小心!即使您发现格式良好的UTF-8序列,也无法将其与ISO-8859字符的差异区分开来!