在Drupals HTML中不会打印UTF8字符

时间:2010-07-28 22:16:42

标签: php mysql drupal utf-8

我正在尝试调试令人讨厌的utf-8问题,并且不知道从哪里开始。

一个页面包含'categorieën'这个词,它应该是类别。显然UTF-8有问题。所有这些多咬字符都会发生这种情况。我已经在UTF8上扫描了大量的主题,但它们主要涵盖了基础知识,而不是这种情况,其中所有内容都配置和设置正确,但显然不是。

这些页面由Drupal从MySQL数据库提供。

数据库是通过sql-dumping迁移(不是我),而是通过phpmyadmin进行迁移。那里出现问题的机会很大,因为之前没有问题。并且因为问题仅发生在较旧的导入项目上。编辑这些项目或插入新项目,并手动修复错误编码的字符,解决了问题。虽然我看不出数据库中的差异。

  • 通过Drupal重新编辑的内容没有此问题。
  • 当在CLI上使用MySQL时,我可以读出该文本并获得正确的ë字符。在两个文章中呈现“正确”和“不正确”的字符。
  • 表格有排序utf8_general_ci
  • 标题似乎以正确的编码发送:Vary Accept-EncodingContent-Type text/html; charset=utf-8
  • HTML头包含<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  • HTTP标头告诉我中间有一个Varnish代理。这可能导致UTF8转换/破坏
  • 内容在Gupip中提供,在Drupal中是正常的,我从未见过这种UTF8问题,但是你从来都不知道。

看来输入是罪魁祸首,我想知道 a)出了什么问题。 b)为什么我看不出mysql cli客户端在“错误”和“正确”字符之间的区别 c)如何修复数据库,或从哪里开始查看和学习如何修复它。

4 个答案:

答案 0 :(得分:4)

转储文件可能输出为UTF-8,但在导入期间解释为latin1。

ë,即UTF-8的ë的latin1双字节表示,在您的表格中作为UTF-8数据。

看到你混合了完整的损坏的数据,这很难以一般的方式解决,但通常,这种肮脏的解决方法 * 会很好用:

UPDATE table SET column = REPLACE("ë", "ë", column);

除非您使用的语言不是荷兰语,否则破碎字符的范围应该非常有限,您可以使用少量此类语句来修复它。

有相同问题的相关问题:

* (当然,不要忘记在运行此类内容之前进行备份!)

答案 1 :(得分:0)

在导出和导入Drupal转储时应该没有任何问题,除非这样做的人以某种方式成功地将导出设置为UTF8以外的其他东西。我们经常出口/进口垃圾场,从未遇到过这样的问题。

希望Pekkas的答案将帮助您解决问题,如果它在数据库中,但我也认为您可以检查网页上显示的数据是否正在运行一些不是多字节友好的PHP函数。

以下是mb中正常函数的一些等价物:http://php.net/manual/en/ref.mbstring.php

PS。如果您最近将您的站点移动到另一台服务器(因此它不仅仅是数据库导入),您应该使用http://www.webconfs.com/http-header-check.php

等工具检查您的网站发送的标头。

确保最后一行包含UTF8。

答案 2 :(得分:0)

您提到导入可能是问题所在。在这种情况下,可能在导入期间与客户端和MySQL服务器的连接没有使用UTF-8。我过去曾经多次遇到过这个问题,所以我想与你分享这些MySQL设置(在my.conf中):

在服务器设置下添加以下内容:

# UTF 8
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci
skip-character-set-client-handshake

在客户端设置下添加:

default-character-set=utf8

这可能会让你下次有些头痛。

答案 3 :(得分:0)

绝对确定你从头到尾都有utf8:
    - 没有BOM的utf8中的源代码文件     - 使用utf8校对的数据库
    - 使用utf8校对的数据库表
    - utf8中的数据库连接(使用'SET CHARSET UTF8'查询)
    - 页面标题设置为utf8(也是ajax)     - 在utf8中设置页面的元标记