php - UTF-8贯穿始终

标签 php mysql linux apache utf-8

我正在设置一个新服务器,并希望在我的Web应用程序中完全支持UTF-8。我过去曾在现有服务器上尝试过此操作,但最终似乎总是不得不退回到ISO-8859-1。

我到底需要在哪里设置编码/字符集?我知道我需要配置Apache,MySQL和PHP来执行此操作-是否可以遵循一些标准清单,或者解决不匹配的地方?

这是用于运行Linux 5,PHP,5和Apache 2的新Linux服务器。

最佳答案

数据存储:


在数据库的所有表和文本列上指定utf8mb4字符集。这使得MySQL在物理上存储和检索以UTF-8本地编码的值。请注意,如果指定了utf8mb4排序规则(没有任何显式字符集),则MySQL将隐式使用utf8mb4_*编码。
在旧版本的MySQL(<5.5.3)中,不幸的是,您将被迫仅使用utf8,它仅支持Unicode字符的子集。我希望我在开玩笑。


资料存取:


在您的应用程序代码(例如PHP)中,无论您使用哪种数据库访问方法,都需要将连接字符集设置为utf8mb4。这样,当MySQL将数据交给您的应用程序时,MySQL不会从其本地UTF-8进行转换,反之亦然。
一些驱动程序提供了自己的配置连接字符集的机制,该机制既可以更新其自身的内部状态,又可以将要在连接上使用的编码通知MySQL-这通常是首选方法。在PHP中:


如果在PHP≥5.3.6中使用PDO抽象层,则可以在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的相同考虑如上所述。


输出:


如果您的应用程序将文本传输到其他系统,则还需要告知他们字符编码。对于Web应用程序,必须告知浏览器发送数据的编码(通过HTTP响应标头或HTML metadata)。
在PHP中,可以使用default_charset php.ini选项,或者自己手动发出Content-Type MIME标头,这虽然工作更多,但效果相同。
使用json_encode()编码输出时,请添加JSON_UNESCAPED_UNICODE作为第二个参数。


输入:


不幸的是,在尝试存储或在任何地方使用它之前,您应该验证每个接收到的字符串都是有效的UTF-8。 PHP的mb_check_encoding()可以达到目的,但是您必须谨慎使用它。确实没有办法解决这个问题,因为恶意客户端可以使用他们想要的任何编码来提交数据,而且我还没有找到使PHP可靠地为您执行此操作的技巧。
从我对当前HTML spec的阅读中,对于现代HTML,以下子项目不再是必需的,甚至不再有效。我的理解是,浏览器将使用为文档指定的字符集并提交数据。但是,如果您定位的是旧版HTML(XHTML,HTML4等),则以下几点可能仍然有用:


仅适用于HTML5之前的HTML:您希望浏览器发送给您的所有数据都使用UTF-8。不幸的是,如果唯一可靠的方法是将accept-charset属性添加到所有<form>标签:<form ... accept-charset="UTF-8">
仅对于HTML5之前的HTML:请注意,W3C HTML规范指出,客户端“应该”默认使用服务器提供的任何字符集将表单发送回服务器,但这显然只是一个建议,因此需要在每一个服务器上都明确<form>标记。



其他代码注意事项:


显然,您将要提供的所有文件(PHP,HTML,JavaScript等)都应使用有效的UTF-8编码。
您需要确保每次处理UTF-8字符串时都必须安全进行。不幸的是,这是最困难的部分。您可能需要广泛使用PHP的mbstring扩展名。
PHP的内置字符串操作默认情况下不是UTF-8安全的。您可以使用正常的PHP字符串操作(例如串联)安全地进行某些操作,但是对于大多数事情,您应该使用等效的mbstring函数。
要知道您在做什么(阅读:不要搞砸),您确实需要了解UTF-8及其在最低级别上的工作方式。查看utf8.com中的任何链接以获取一些好的资源,以学习您需要了解的所有内容。

关于php - UTF-8贯穿始终,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43962031/

相关文章:

mysql - 将 Spark 和 Mysql 与 mysql-connector-java 结合使用

linux - 每次我对 linux 内核做一点改动时,我是否应该安装 modules_install

linux - 如何列出 nginx 中的所有虚拟主机

php - 添加到购物车错误后 Woocommerce 重定向

php - 嵌入名为 “Button” : the prototype contains a wrong form 的实体的表单集合

php - 在php中自动定期从数据库发布数据

MySQL 还不支持 Limit&& in/all?

linux - RH 7.1 Linux,yum 安装问题

php - 如何使用 Codeigniter 上传文本文件并将其数据导入到 sql 中?

javascript - PHP json_encode 编码函数