【问题标题】:php mysql character set: storing html of international contentphp mysql 字符集:存储国际内容的html
【发布时间】:2010-10-15 10:31:11
【问题描述】:

我完全被我所读到的关于字符集的内容弄糊涂了。我正在开发一个接口来在 mysql 数据库中存储 html 格式的法语文本。

我的理解是,正确显示所有法语特殊字符的安全方法是将它们存储为 utf8。所以我创建了一个mysql数据库,为数据库和每个表指定了utf8。 我可以通过 phpmyadmin 看到字符的存储方式完全符合预期。但是通过 php 输出这些字符会给我带来不稳定的结果:重音字符被无意义的字符替换。这是为什么呢?

我必须对它们进行 utf8_encode 或 utf8_decode 吗?注意:html页面字符编码设置为utf8。

更一般地说,存储这些数据的安全方法是什么?我应该在保存时结合 htmlentities、addslashes 和 utf8_encode,而在输出时结合 stripslashes、html_entity_decode 和 utf8_decode?​​p>

【问题讨论】:

    标签: php mysql character-encoding


    【解决方案1】:

    MySQL 即时将字符集转换为称为connection charset 的东西。您可以使用 sql 语句指定此字符集

    SET NAMES utf8
    

    或使用特定的API函数,例如mysql_set_charset()

    mysql_set_charset("utf8", $conn);
    

    如果正确完成,则无需使用 utf8_encode() 和 utf8_decode() 等函数。

    您还必须确保浏览器使用相同的编码。这通常使用一个简单的标题来完成:

    header('Content-type: text/html;charset=utf-8');
    

    (请注意,该字符集在浏览器中称为 utf-8,而在 MySQL 中称为 utf8。)

    在大多数情况下,连接字符集和网络字符集是您唯一需要跟踪的内容,因此如果仍然无法正常工作,则可能是您做错了其他事情。尝试一下,通常需要一段时间才能完全理解。

    【讨论】:

    • 谢谢。在插入和选择数据之前,我会系统地执行此集合名称查询。那没有帮助。我的问题其实更多的是关于php和端浏览器如何操作sql数据以及如何控制它。
    【解决方案2】:

    除了 Emil H 所说的,你的页面中还需要这个head 标签:

    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    

    【讨论】:

      【解决方案3】:

      考虑 PHP 生成的前端和 MySQL 后端的独立组件很有用。 MySQL 不必担心显示逻辑,PHP 也不应假定后端对数据进行任何类型的预处理。

      我的建议是使用 utf8 编码以纯字符存储数据,并使用 MySQL 方法转义任何危险字符。 然后 PHP 从数据库中读取 utf8 编码的数据,处理它们(通常使用 htmlentities()),并通过您选择使用的任何模板显示它。

      Emil H. 正确建议使用

       SET NAMES utf8
      

      这应该是您在建立 MySQL 连接后调用的第一件事。这使得 MySQL 将所有输入和输出都视为 utf8。

      请注意,如果您必须使用 utf8_encode 或 utf8_decode 函数,则说明您没有正确设置 html 字符编码。要求系统的每个组件都使用 utf8 是最简单的,因为这样您就不必手动编码/解码,这可能会导致以后难以跟踪问题。

      【讨论】:

        【解决方案4】:

        我强烈建议阅读 Joel Spolsky 撰写的这篇文章 "The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)",以了解您在做什么以及为什么。

        【讨论】:

          猜你喜欢
          • 2011-09-29
          • 1970-01-01
          • 2010-12-16
          • 1970-01-01
          • 1970-01-01
          • 2012-07-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多