我正在设置一个新服务器,希望在我的web应用程序中完全支持UTF-8。我过去曾在现有服务器上尝试过这一点,但最终似乎不得不回到ISO-8859-1
我到底需要在哪里设置编码/字符集?我知道我需要配置Apache、MySQL和PHP来实现这一点——我是否可以遵循一些标准检查表,或者对出现不匹配的地方进行故障排除
这是一个新的Linux服务器,运行MySQL 5、PHP、5和Apache 2
数据存储:
-
在数据库中的所有表和文本列上指定
utf8mb4字符集。这使得MySQL物理上存储和检索以UTF-8本机编码的值。请注意,如果指定了排序规则(没有任何显式字符集),MySQL将隐式使用utf8mb4编码 -
在较旧版本的MySQL(<;5.5.3)中,不幸的是,您不得不简单地使用
utf8,它只支持Unicode字符的子集。我希望我是在开玩笑
数据访问:
-
在应用程序代码(例如PHP)中,无论使用何种DB访问方法,都需要将连接字符集设置为
utf8mb4。这样,当MySQL将数据交给您的应用程序时,它不会从本机UTF-8进行转换,反之亦然 -
一些驱动程序提供了自己的机制来配置连接字符集,它既更新自己的内部状态,又通知MySQL要在连接上使用的编码,这通常是首选方法。在PHP中:
-
如果将PDO抽象层与PHP一起使用≥ 5.3.6,您可以在DSN中指定
charset:$dbh=newpdo('mysql:charset=utf8mb4'); -
如果您正在使用mysqli,可以调用
set\u charset():$mysqli->;set_字符集('utf8mb4');//面向对象风格 mysqli_set_字符集($link,'utf8mb4');//程序风格 -
如果您使用的是纯mysql,但碰巧运行的是PHP≥ 5.2.3,您可以调用
mysql\u set\u charset
-
-
如果驱动程序没有提供自己的机制来设置连接字符集,那么您可能必须发出一个查询,告诉MySQL您的应用程序希望如何对连接上的数据进行编码:
set NAMES'utf8mb4' -
关于
utf8mb4/utf8的考虑同样适用于上述情况
输出:
-
如果您的应用程序将文本传输到其他系统,则还需要通知他们字符编码。对于web应用程序,必须通知浏览器发送数据的编码(通过HTTP响应头或HTML元数据)
-
在PHP中,您可以使用
default\u charsetPHP.ini选项,或者自己手动发出Content-TypeMIME头,这只是更多的工作,但具有相同的效果 -
使用
json\u encode()对输出进行编码时,添加json\u UNESCAPED\u UNICODE作为第二个参数
输入:
-
不幸的是,在您尝试存储或在任何地方使用它之前,您应该验证每个接收到的字符串是否是有效的UTF-8。PHP的
mb\u check\u encoding()可以做到这一点,但你必须虔诚地使用它。真的没有办法解决这个问题,因为恶意客户端可以以他们想要的任何编码提交数据,我还没有找到让PHP可靠地为您完成这项工作的窍门 -
从我对当前HTML规范的阅读来看,以下子项目符号对于现代HTML不再是必需的,甚至不再有效。我的理解是,浏览器将使用并提交文档指定字符集中的数据。但是,如果您针对的是较旧版本的HTML(XHTML、HTML4等),以下几点可能仍然有用:
- 对于HTML5之前的HTML,仅限:您希望浏览器发送给您的所有数据都是UTF-8格式。不幸的是,如果要可靠地执行此操作,唯一的方法是将
accept charset属性添加到所有<;表格>标记:<;类型接受字符集=";UTF-8“&燃气轮机 - 仅适用于HTML5之前的HTML:请注意,W3C HTML规范规定客户端;应该";默认情况下,将表单以服务器提供的任何字符集发送回服务器,但这显然只是一个建议,因此需要在每一个
<;表格>标签
- 对于HTML5之前的HTML,仅限:您希望浏览器发送给您的所有数据都是UTF-8格式。不幸的是,如果要可靠地执行此操作,唯一的方法是将
其他代码注意事项:
-
显然,您要提供的所有文件(PHP、HTML、JavaScript等)都应该使用有效的UTF-8编码
-
您需要确保每次处理UTF-8字符串时都是安全的。不幸的是,这是最困难的部分。您可能希望广泛使用PHP的
mbstring扩展 -
PHP的内置字符串操作在默认情况下是而不是UTF-8安全的。使用普通PHP字符串操作(如连接)可以安全地执行一些操作,但对于大多数操作,您应该使用等效的
mbstring函数 -
要知道你在做什么(阅读:不要搞砸了),你真的需要知道UTF-8以及它是如何在尽可能低的级别上工作的。查看utf8.com上的任何链接,获取一些好的资源,以了解您需要了解的一切