如何确定这是 latin1 还是 utf8?

joe*_*els 1 c character-encoding

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

\n\n

在调试器中它看起来像:

\n\n
"Art\\xeest\\xe9"\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
41 72 74 EE 73 74 E9\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

Ste*_*sop 5

\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 的情况很常见,拒绝所有这些代码点是相当徒劳的,除非您从另一个字符集转换为 Latin-1,并且想要严格执行什么操作。你输出。CP1252 也有一些未使用的字节,但数量不多。