我有一个表格,用于存储一些文本标签。最初它是使用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");
如果您也浪费了足够的时间来尝试元标记和标头,请尝试一下此解决方案。
不要使用 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
;或我可以找到一种方法来挽救您的数据。