【问题标题】:Wrong encoding of Russian, Portuguese etc. text俄语、葡萄牙语等文本的错误编码
【发布时间】:2016-05-11 09:45:57
【问题描述】:

我有一个存储一些文本标签的表格。最初它是使用 latin_swedish_ci(默认)排序规则构建的。

现在我需要支持其他语言,例如俄语。我有两个使用这些标签的页面。一个显示它们很好,尽管该表仍然使用拉丁排序规则而不是 utf8_generic_ci,但是另一页仍然显示垃圾。当我查看源代码时,它看起来像这样:

\u00d0\u00a4\u00d0\u00b8\u00d0\u00bb\u00d1\u0152\u00d1\u201a\u00d1\u20ac\

两个页面都有:

 <META http-equiv="Content-type" content="text/html;charset=UTF-8">

我错过了什么?


更新:

我不知道为什么以及它是如何工作的,但我最终在查询插入/更新之前以及在页面上呈现之前添加了以下内容,它解决了我的所有问题:

mysql_query("SET NAMES utf8"); 

如果您在尝试元标记和标头上浪费了足够多的时间,请试一试此解决方案。

【问题讨论】:

  • 您需要将 PHP、HTML、数据库/表和连接对象的字符集设置为相同的内容,在您的情况下为 UTF-8。为避免字符损坏,everything 必须是相同的字符集。
  • 哎呀,我认为您的演示链接 (usabilitest.com/uxXQAzq)(我不太懂俄语)显示正确。而且,如果我没记错的话,您遇到的情况应该同时支持葡萄牙语和俄语。在这种情况下,UTF-8 中的 Everything 是最好的。
  • 顺便说一句,此链接可能会有所帮助:stackoverflow.com/questions/12756877/…
  • 指令显示正确,因为我从不同的表中提取它们。关闭模式后,容器会将其置于 EN、PT 和 RU 中。我将表格转换为 utf8_general_ci,但仍然看到所有值都乱七八糟,如下所示:Ðто быÑтрый теÑÑ。我什至在我插入/更新数据库的 PHP 文件中添加了以下标头: header("Content-Type: text/html; charset=UTF-8");但无济于事......呃。

标签: php mysql utf-8 collation


【解决方案1】:

不要不要使用mysql_*接口;切换到mysqli_*

你可能想要Фил...之类的东西?

弄得一团糟可能有两个错误。

meta 标签很好;需要SET NAMES utf8

但可能你在表中存储了垃圾。那么,我们来看一下表格:SELECT col, hex(col) FROM tbl...

对于Фил,您应该看到D0A4D0B8D0BB 的十六进制。如果你看到C390C2A4C390C2B8C390C2BB,你有“双重编码”。相反,您似乎以某种方式获得了“unicode”而不是“utf8”,并且可能来自您开始使用的“latin1”。注意D0 A4 D0 B8 D0 BB 是如何出现在我的十六进制和你的\u00d0... 中的?

如果您可以重新开始,请这样做:

  • 客户端中的utf8编码
  • SET NAMES utf8
  • CHARACTER SET utf8 在列/表上
  • &lt;meta charset=UTF-8&gt;

如果你不能重新开始,让我们看看我要求的SELECT也许我可以找到一种方法来挽救你的数据。

【讨论】:

    猜你喜欢
    • 2017-08-22
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多