我正在安装一台新服务器,希望在我的web应用程序中完全支持UTF-8.我过go 曾在现有服务器上try 过这一点,但最终似乎不得不回到ISO-8859-1.
我需要在哪里设置编码/字符集?我知道我需要配置Apache、MySQL和PHP来实现这一点——我是否可以遵循一些标准 list ,或者在出现不匹配的地方进行故障排除?
这是一个新的Linux服务器,运行MySQL 5、PHP、5和Apache 2.
我正在安装一台新服务器,希望在我的web应用程序中完全支持UTF-8.我过go 曾在现有服务器上try 过这一点,但最终似乎不得不回到ISO-8859-1.
我需要在哪里设置编码/字符集?我知道我需要配置Apache、MySQL和PHP来实现这一点——我是否可以遵循一些标准 list ,或者在出现不匹配的地方进行故障排除?
这是一个新的Linux服务器,运行MySQL 5、PHP、5和Apache 2.
Data Storage:
在数据库中的所有表和文本列上指定utf8mb4
个字符集.这使得MySQL能够物理地存储和检索以UTF-8本机编码的值.请注意,如果指定了utf8mb4_*
排序规则(没有任何显式字符集),MySQL将隐式使用utf8mb4
编码.
在较旧版本的MySQL(<;5.5.3)中,不幸的是,您将被迫使用simply utf8
,它只支持Unicode字符的一个子集.我希望我是在Jest .
Data Access:
在您的应用程序代码(例如PHP)中,无论您使用哪种DB访问方法,都需要将连接字符集设置为utf8mb4
.这样,当MySQL将数据传递给您的应用程序时,不会从其原生UTF-8进行转换,反之亦然.
一些驱动程序提供了自己的机制来配置连接字符集,该机制既更新自己的内部状态,又通知MySQL要在连接上使用的编码-这通常是首选方法.在PHP中:
如果你在PHP中使用PDO抽象层≥ 5.3.6,您可以在DSN中指定charset
:
$dbh = new PDO('mysql:charset=utf8mb4');
如果使用mysqli,可以拨打set_charset()
:
$mysqli->set_charset('utf8mb4'); // object oriented style
mysqli_set_charset($link, 'utf8mb4'); // procedural style
如果你坚持使用纯mysql,但碰巧正在运行PHP≥ 5.2.3,你可以拨打mysql_set_charset
.
如果驱动程序没有提供自己的机制来设置连接字符集,您可能需要发出一个查询来告诉MySQL应用程序期望连接上的数据如何编码:SET NAMES 'utf8mb4'
.
关于utf8mb4
/utf8
的同样考虑也适用于上述情况.
Output:
如果您的应用程序将文本传输到其他系统,则还需要通知它们字符编码.对于Web应用程序,必须通知浏览器发送数据的编码(通过HTTP响应头或HTML metadata).
在PHP中,可以使用default_charset
PHP.ini选项,或者自己手动发出Content-Type
MIME头,这只是更多的工作,但具有相同的效果.
使用json_encode()
对输出进行编码时,添加JSON_UNESCAPED_UNICODE
作为第二个参数.
Input:
不幸的是,在try 存储或在任何地方使用它之前,都应该验证每个接收到的字符串是否有效.PHP的mb_check_encoding()
实现了这一点,但你必须虔诚地使用它.真的没有办法解决这个问题,因为恶意客户端可以以他们想要的任何编码提交数据,而我还没有找到让PHP可靠地为您完成这项工作的诀窍.
从我对当前HTML spec条的阅读来看,以下子项目符号对于现代HTML来说不再是必要的,甚至不再有效.我的理解是,浏览器将使用并提交文档指定字符集的数据.但是,如果您针对的是较旧版本的HTML(XHTML、HTML4等),以下几点可能仍然有用:
accept-charset
属性添加到所有<form>
个标记中:<form ... accept-charset="UTF-8">
.<form>
个标记上显式显示.Other Code Considerations:
显然,您将提供的所有文件(PHP、HTML、JavaScript等)都应该使用有效的UTF-8编码.
您需要确保每次处理UTF-8字符串时都是安全的.不幸的是,这是最困难的部分.您可能希望广泛使用PHP的mbstring
扩展.
PHP's built-in string operations are not by default UTF-8 safe.使用普通的PHP字符串操作(比如连接)可以安全地完成一些事情,但对于大多数事情,应该使用等效的mbstring
函数.
要知道您在做什么(请阅读:不要搞砸),您真的需要了解UTF-8以及它是如何在尽可能低的级别上工作的.查看从utf8.com开始的任何链接,获得一些好的资源,以了解您需要了解的一切.