2010-07-28 55 views
1

我试图调试讨厌的utf-8问题,并且不知道从哪里开始。在Drupals中没有打印出UTF8字符HTML

一个页面包含单词'categorieà«n',这应该是categorieën。很明显UTF-8出了问题。所有这些多边字符都会发生这种情况。我已经在UTF8上扫描了gazillion主题,但他们大多覆盖了基础知识,而不是这种情况,一切似乎都配置正确,但显然不是。

这些页面由Drupal提供,来自MySQL数据库。

数据库已被sql-dumping和-importing trough 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头告诉我,有一个其间光油代理。这可能导致UTF8转换/破坏
  • 内容服务Gzipped,在Drupal正常,我从来没有见过这个UTF8 issie wrt gzip,但你永远不知道。

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

回答

4

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

UTF-8的latin1双字节表示ëë在您的表中作为UTF-8数据物理存在于您的表中。

看到,因为你有完整破损数据的组合,这将是艰难的以一般的方式来解决,但通常情况下,这个肮脏的解决办法*将工作做好:

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

除非你正在使用除荷兰语以外的其他语言,破碎字符的范围应该是非常有限的,你可能可以用少量的这种语句来修复它。

相关问题,同样的问题:

* (当然,不要忘了运行这样的事情之前要备份! )

0

在导出和导入Drupal转储时应该没有任何问题,除非这样做的人以某种方式成功地将导出设置为UTF8以外的其他内容。我们出口/进口转储很多,从来没有遇到过这样的问题。

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

下面是在MB的正常功能的一些等同物:http://php.net/manual/en/ref.mbstring.php

PS。如果您最近将网站迁移到另一台服务器(所以它不只是一个数据库导入),你应该检查哪些邮件头。您的网站有一个工具,如http://www.webconfs.com/http-header-check.php

确保最后一排有UTF8在其发送出去。

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 

这有可能在未来的时间节省一些头痛。

0

要绝对确保你有UTF8从开始到结束:
- 在UTF8源代码文件没有BOM
- 数据库UTF8归类
- 与UTF8归类数据库表
- 在UTF8数据库连接(查询它与'SET CHARSET UTF8')
- 页面标题设置为utf8(也是ajax的) - 用于设置页面的元标记utf8