代码之家  ›  专栏  ›  技术社区  ›  berkes

未在Drupals HTML中打印的utf8字符

  •  1
  • berkes  · 技术社区  · 14 年前

    我试图调试一个讨厌的UTF-8问题,不知道从哪里开始。

    页面中包含“categories_n”一词,wich应该是categories_n。显然,utf-8有问题。所有这些多比特的角色都会发生这种情况。我已经扫描了这里关于utf8的gazillion主题,但它们大多涵盖了基础知识,而不是在这种情况下,所有的配置和设置似乎都是正确的,但显然不是。

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

    数据库是通过phpmyadmin通过SQL转储和导入迁移的(不是由我)。很有可能那里出了点问题,因为以前没有问题。因为问题只发生在旧的导入项目上。编辑这些项目或插入新项目,并手动修复错误编码的字符,可以解决问题。尽管我看不出数据库有什么不同。

    • 通过Drupal重新编辑的内容没有这个问题。
    • 当在cli上使用mysql时,我可以读取该文本并获得正确的_字符。在呈现“正确”和“不正确”字符的文章中。
    • 表具有排序规则 utf8_general_ci
    • 邮件头似乎以正确的编码发送: Vary Accept-Encoding Content-Type text/html; charset=utf-8
    • HTML头包含 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    • HTTP头告诉我中间有一个Varnish代理。会导致utf8转换/中断吗?
    • 内容是以gzip格式提供的,在Drupal中是正常的,我从来没有看到过用gzip格式提供的utf8 issie,但是你永远不会知道。

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

    4 回复  |  直到 13 年前
        1
  •  4
  •   Community Navdeep Singh    7 年前

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

    这个 ë ,utf-8的拉丁1双字节表示 ë ,在您的表中物理上是UTF-8数据。

    就像你有一个完整的混合体 数据损坏,这将很难用一般的方法修复,但通常,这种肮脏的解决方法 * 会很好地工作:

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

    除非您使用的是荷兰语以外的其他语言,否则中断字符的范围应该非常有限,并且您可以使用少量这样的语句来修复它。

    同一问题的相关问题:

    * (当然, 别忘了备份 在运行类似的程序之前!)

        2
  •  0
  •   red    13 年前

    在导出和导入Drupal转储文件时不应该有任何擅离职守的地方,除非这样做的人以某种方式成功地将导出设置为utf8以外的东西。我们出口/进口垃圾很多,从未遇到过这样的问题。

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

    以下是以MB为单位的正常函数的一些等价物: http://php.net/manual/en/ref.mbstring.php

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

    确保最后一行中有utf8。

        3
  •  0
  •   Berklee    13 年前

    你提到进口可能是问题所在。在这种情况下,在导入与客户机和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
    

    这可能下次会让你省去一些头痛。

        4
  •  0
  •   GMO    13 年前

    要确保从头到尾都有utf8,请执行以下操作:
    -源代码文件采用UTF8格式,不含BOM
    -带有utf8排序规则的数据库
    -带有UTF8排序规则的数据库表
    -以utf8为单位的数据库连接(使用“set charset utf8”进行查询)
    -页面标题设置为utf8(Ajax也是如此) -以utf8设置页面的元标记