【问题标题】:How can I find out which character a certain string is encoding in my database?如何找出某个字符串在我的数据库中编码的字符?
【发布时间】:2020-01-29 18:45:30
【问题描述】:

最近我导出了我的mySQL 数据库的部分内容,并注意到文本中有几个奇怪的字符。比如字符串’经常出现。

当试图找出这意味着什么时,我发现了 stackoverflow 问题:Character Encoding and the ’ Issue。从那个问题我现在知道字符串 ’ 代表引号。

但是我怎样才能更普遍地找出一串字符代表什么?例如,Â这个字母也经常出现在我的数据库中,实际上是在某个页面上给我带来了问题,为了解决这个问题,我想知道那个字符的含义。

我查看了几个显示字符编码的表格,但无法弄清楚如何使用这些表格来了解为什么 ’ 意味着 ',或者,对我来说更重要的是,Â代表。如果有人能指出正确的方向,我将不胜感激。

【问题讨论】:

  • UTF8 很大,通常i18nqa.com/debug/utf8-debug.html 有助于处理最常见的字符。下次导出前先检查编码
  • @nbk 非常感谢!我在表格中找到了Â,结果它代表U+00A0,这是一个不间断的空格——这将帮助我解决我的其他问题。

标签: mysql utf-8


【解决方案1】:

’ 的 latin1 编码是(十六进制)E28099

的 utf8 编码是 E28099

但是你粘贴了C3A2E282ACE284A2,这是那个撇号的“双重编码”。

显然发生的事情是您在客户端中有;客户端正在生成 utf8 编码。但是您与 MySQL 的连接参数说“latin1”。因此,您的 INSERT 语句尽职尽责地将其视为 3 个 latin1 字符 E2 80 99(视觉上为 ’),并将每个字符转换为 utf8、十六进制 C3A2 E282AC E284A2

阅读Trouble with UTF-8 characters; what I see is not what I stored中的“双重编码”

同时,浏览器倾向于容忍双重编码,否则它可能会显示’

latin1 个字符是每个 1 字节(2 个十六进制数字)。 utf8/utf8mb4 字符为 1 到 4 个字节;您的练习中出现了一些 2 字节和 3 字节的编码。

至于Â...转到http://mysql.rjweb.org/doc.php/charcoll#8_bit_encodings 并查看那里的第二张表。注意前两列有很多以 开头的内容。在 latin1 中,即十六进制 C2。在 utf8 中,许多标点符号被编码为 2 个字节:C2xx。例如,版权符号© 是utf8 hex C2A9,被误解为©

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 2012-01-16
    相关资源
    最近更新 更多