如何正确处理PHP / MySQL / Apache中的国际字符

时间:2009-11-13 11:46:57

标签: php mysql apache unicode

我需要在PHP中创建一个可以处理所有地方的所有Unicode字符的应用程序 - 编辑字段,静态HTML,数据库。有人可以告诉我需要设置/用于实现这一目标的所有参数/功能的完整列表吗?

5 个答案:

答案 0 :(得分:7)

<强>的Apache

服务器编码必须未设置或设置为UTF-8。这是通过apache AddDefaultCharset指令完成的。这可以转到virtualhost或常规文件(参见文档)。

AddDefaultCharset utf-8

<强> MySQL的

  • 将数据库的排序规则设置为UTF-8
  • 设置连接编码。它可以像有人用mysqli_set_charset说的那样完成,也可以在连接后发送:
    SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'

<强> PHP

1-您应该通过页面上的元标记或通过PHP标头将页面的HTML字符集设置为UTF-8:

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-or-
    header('Content-type: text/html; charset=utf-8');

2-你应该总是使用mb *版本的字符串相关函数,例如,mbstrlen而不是strlen来获取字符串的字符串长度。

这应该允许你从页面到数据到处都有UTF-8。您可以进行的测试:使用firefox右键单击页面上的任意位置,然后选择显示页面信息。有效编码列在该页面中。

答案 1 :(得分:1)

重要提示:从PHP连接到Mysql时,还应确保使用UTF-8作为连接字符集!

对于mysqli,这是由

完成的
mysqli_set_charset($dblink, 'utf-8')

http://de3.php.net/manual/en/mysqli.set-charset.php

答案 2 :(得分:1)

您需要了解的一些事项: -

<强> PHP

确保您的内容标记为utf-8:

default_charset = "utf-8"

安装mbstring。你可以找到它here

确保你在PHP和MySQL之间谈论utf-8 调用mysql_set_charset("utf8");(或使用SQL查询SET NAMES utf8

<强>的Apache

您还可以使用此类

在此处设置网页的Content-Type:

AddDefaultCharset utf-8

<强>的MySQL

确保所有表格都使用utf8 Collat​​ion utf8_general_ci;例如

ALTER DATABASE mydb CHARACTER SET utf8;

<强>最后

最后,使用有趣的unicode样本测试内容like these ones

9(͡๏̯͡๏)6

来自when I tried this ...

的更多有用信息

答案 3 :(得分:1)

建议您使用HTTP标头或元元素将页面上的字符集设置为utf-8。 W3C建议您同时执行这两项操作。元元素应尽可能早地出现在页面上。 (元元素之前的所有字符都应该是ASCII,几乎所有字符编码都基本相同。有些浏览器会在遇到元标记时重新启动页面呈现,这是另一个很好的理由。)

此外,在接受用户输入的所有表单上都放置了accept-charset="utf-8"属性。通常,提交POST数据的浏览器将默认为页面的编码,但确定无误。

答案 4 :(得分:0)

我使用了上述方法并且工作正常。直到最近,当我的提供商将PHP更新到5.2.11并将MySQL更新到5.0.81-community时。在此更改之后,从数据库中正确检索了unicode字符,但所有更新都已损坏,并且unicode字符被“?”替换。

解决方案是使用:

mysql_set_charset('utf8',$conn);

即使我们使用了它也是必需的:

SET NAMES utf8
SET CHARACTER SET utf8

另外 - 因为我们使用过ADOdb,所以我们需要找到PHP连接句柄。我们使用了以下声明:

mysql_set_charset('utf8',$adoConn->_connectionID);