始终使用UTF-8编码
P粉548512637
2023-07-24 19:47:11
<p>
我正在设置一个新的服务器,并希望在我的Web应用程序中完全支持UTF-8。我以前在现有服务器上尝试过这个,但似乎总是不得不回退到ISO-8859-1。<br />我需要在哪里设置编码/字符集?我知道我需要配置Apache、MySQL和PHP来实现这一点。是否有一份标准的清单可以供我参考,或者可以排查不匹配的地方?<br />这是一个运行MySQL 5、PHP 5和Apache 2的新Linux服务器。<br /></p><p><br /></p>
我想在chazomaticus的出色回答中补充一点:
也不要忘记META标签(像这样,或者HTML4或XHTML版本的):
这似乎是微不足道的,但是IE7以前曾经给我带来过问题。
我做的一切都是正确的;数据库、数据库连接和Content-Type HTTP头都设置为UTF-8,在所有其他浏览器中都正常工作,但是Internet Explorer仍然坚持使用"西欧"编码。
结果发现页面缺少META标签。添加了之后问题得到解决。
Edit:
W3C实际上有一个相当大的部分专门针对国际化(I18N)问题。他们有许多与此问题相关的文章,涵盖了HTTP、(X)HTML和CSS方面的内容:
他们建议同时使用HTTP头和HTML的meta标签(或者在以XML形式提供的XHTML中使用XML声明)。
数据存储:
在数据库中的所有表和文本列上指定utf8mb4字符集。这样,MySQL将以UTF-8的本地编码方式物理存储和检索值。请注意,如果指定了utf8mb4_*排序规则(没有任何显式字符集),MySQL将隐式使用utf8mb4编码。
在旧版本的MySQL(< 5.5.3)中,您将不得不使用仅支持Unicode字符子集的简单utf8,对此我感到很遗憾,但这是事实。
数据访问:
在您的应用程序代码(例如PHP)中,无论您使用什么数据库访问方法,都需要将连接字符集设置为utf8mb4。这样,当MySQL将数据传递给您的应用程序时,它不会进行任何从其本地UTF-8的转换,反之亦然。
一些驱动程序提供了自己的机制来配置连接字符集,该机制既更新其自身的内部状态,也通知MySQL在连接上使用的编码 - 这通常是首选的方法。在PHP中:
如果您使用的是PHP ≥ 5.3.6的PDO抽象层,您可以在DSN中指定字符集:
If you're using mysqli, you can call set_charset():
如果您只能使用普通的mysql函数,但是运行的是PHP ≥ 5.2.3,您可以调用mysql_set_charset方法。
如果驱动程序没有提供自己的机制来设置连接字符集,您可能需要发出一个查询来告诉MySQL您的应用程序希望如何对连接上的数据进行编码:SET NAMES 'utf8mb4'。
与上述相同的考虑适用于utf8mb4/utf8。
Output:
Input:
其他代码注意事项:
显然,您提供的所有文件(PHP、HTML、JavaScript等)都应该以有效的UTF-8进行编码。
您需要确保每次处理UTF-8字符串时都是安全的。不幸的是,这是最困难的部分。您可能需要广泛使用PHP的mbstring扩展。
PHP的内置字符串操作默认情况下不支持UTF-8。有一些您可以安全地使用普通的PHP字符串操作(比如拼接),但对于大多数操作,您应该使用等效的mbstring函数。
为了知道自己在做什么(即不搞砸),您真的需要了解UTF-8以及它在最低级别上的工作原理。请查看utf8.com上的任何链接,这些链接提供了一些很好的资源,可以让您学到所需的一切知识。