我有一张表,用于存储一些文本标签。最初它是使用 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");
如果您在元标记和 header 上浪费了太多时间,请试一试此解决方案。
最佳答案
不要使用 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
在列/表上 -
<meta charset=UTF-8>
如果你不能重新开始,让我们看看SELECT
我要求; 也许我可以找到一种方法来挽救您的数据。
关于php - 俄语、葡萄牙语等文本编码错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35155990/