我正在设置一个新服务器并希望在我的 Web 应用程序中完全支持 UTF-8。我过去曾在现有服务器上尝试过此方法,但似乎总是不得不退回到 ISO-8859-1。
我到底需要在哪里设置编码/字符集?我知道我需要配置 Apache、MySQL 和 PHP 来执行此操作 — 是否有一些我可以遵循的标准清单,或者可能解决不匹配的位置?
这是一个新的 Linux 服务器,运行 MySQL 5、PHP、5 和 Apache 2。
原文由 mercutio 发布,翻译遵循 CC BY-SA 4.0 许可协议
我想为 chazomaticus 的出色回答 添加一件事:
不要忘记 META 标签(像这样,或者 它的 HTML4 或 XHTML 版本):
<meta charset="utf-8">
这似乎微不足道,但 IE7 之前给我带来了问题。
我做的一切都是正确的;数据库、数据库连接和 Content-Type HTTP 标头都设置为 UTF-8,在所有其他浏览器中运行良好,但 Internet Explorer 仍然坚持使用“西欧”编码。
结果发现该页面缺少 META 标记。添加解决了这个问题。
编辑:
W3C 实际上有一个相当大的 部分专门用于 I18N 。他们有许多与这个问题相关的文章——描述了 HTTP、(X)HTML 和 CSS 方面的内容:
他们建议同时使用 HTTP 标头和 HTML 元标记(或在 XHTML 作为 XML 的情况下使用 XML 声明)。
原文由 mercator 发布,翻译遵循 CC BY-SA 3.0 许可协议
4 回答968 阅读
2 回答713 阅读✓ 已解决
2 回答839 阅读
1 回答643 阅读✓ 已解决
3 回答784 阅读
2 回答617 阅读
1 回答770 阅读
数据存储:
在数据库中的所有表和文本列上指定
utf8mb4字符集。这使得 MySQL 在物理上存储和检索以 UTF-8 原生编码的值。请注意,如果指定了utf8mb4_*排序规则(没有任何显式字符集),MySQL 将隐式使用utf8mb4编码。在旧版本的 MySQL (< 5.5.3) 中,不幸的是,您将被迫简单地使用
utf8,它仅支持 Unicode 字符的子集。我希望我在开玩笑。数据访问:
在您的应用程序代码(例如 PHP)中,无论您使用何种 DB 访问方法,您都需要将连接字符集设置为
utf8mb4。这样,当 MySQL 将数据传递给您的应用程序时,它不会从其本机 UTF-8 进行转换,反之亦然。一些驱动程序提供了自己的机制来配置连接字符集,它既可以更新自己的内部状态,又可以通知 MySQL 要在连接上使用的编码——这通常是首选方法。在 PHP 中:
charset:set_charset():mysql_set_charset。如果驱动程序没有提供自己的设置连接字符集的机制,您可能必须发出一个查询来告诉 MySQL 您的应用程序希望如何对连接上的数据进行编码:
SET NAMES 'utf8mb4'。关于
utf8mb4/utf8的相同考虑适用于上述。输出:
Content-Type: text/html; charset=utf-8。您可以通过在 php.ini(首选)中设置default_charset或手动使用header()函数来实现。json_encode()对输出进行编码时,添加JSON_UNESCAPED_UNICODE作为第二个参数。输入:
mb_check_encoding()可以解决问题,但您必须虔诚地使用它。确实没有办法解决这个问题,因为恶意客户端可以以他们想要的任何编码提交数据,而我还没有找到让 PHP 可靠地为您执行此操作的技巧。其他代码注意事项:
显然,您将提供的所有文件(PHP、HTML、JavaScript 等)都应该以有效的 UTF-8 编码。
您需要确保每次处理 UTF-8 字符串时都是安全的。不幸的是,这是困难的部分。您可能希望广泛使用 PHP 的
mbstring扩展。默认情况下,PHP 的内置字符串操作 不是 UTF-8 安全的。 有些事情你可以安全地使用普通的 PHP 字符串操作(如连接),但对于大多数事情,你应该使用等效的
mbstring函数。要知道你在做什么(阅读:不要搞砸了),你真的需要知道 UTF-8 以及它是如何在尽可能低的级别上工作的。查看来自 utf8.com 的任何链接,以获得一些很好的资源来学习您需要知道的一切。