小编典典

一直到UTF-8

all

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

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

这是一个新的 Linux 服务器,运行 MySQL 5、PHP、5 和 Apache 2。


阅读 160

收藏
2022-02-25

共1个答案

小编典典

数据存储

  • 指定utf8mb4数据库中所有表和文本列的字符集。这使得 MySQL 在物理上存储和检索以 UTF-8 原生编码的值。请注意,如果指定了排序规则(没有任何显式字符集) ,MySQL 将隐式使用utf8mb4编码。utf8mb4_*

  • 在旧版本的 MySQL (< 5.5.3) 中,不幸的是,您将被迫使用 simple utf8,它仅支持 Unicode 字符的子集。我希望我在开玩笑。

数据访问

  • 在您的应用程序代码(例如 PHP)中,无论您使用何种 DB 访问方法,您都需要将连接字符集设置为utf8mb4. 这样,当 MySQL 将数据传递给您的应用程序时,它不会从其本机 UTF-8 进行转换,反之亦然。

  • 一些驱动程序提供了自己的机制来配置连接字符集,它既可以更新自己的内部状态,又可以通知 MySQL 将在连接上使用的编码——这通常是首选方法。在 PHP 中:

    • 如果你使用PHP ≥ 5.3.6的PDOcharset抽象层,你可以在DSN中指定:

           $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 元数据)。

  • 在 PHP 中,您可以使用default_charsetphp.ini 选项,或者自己手动发出Content-TypeMIME 标头,这只是更多的工作,但具有相同的效果。

  • 使用 对输出进行编码时json_encode(),添加JSON_UNESCAPED_UNICODE为第二个参数。

输入

  • 不幸的是,在尝试存储或在任何地方使用它之前,您应该验证每个接收到的字符串是否为有效的 UTF-8。PHPmb_check_encoding()可以解决问题,但您必须虔诚地使用它。确实没有办法解决这个问题,因为恶意客户端可以以他们想要的任何编码提交数据,而我还没有找到让 PHP 可靠地为您执行此操作的技巧。

  • 根据我对当前HTML 规范的阅读,以下子项目符号对于现代 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的任何链接,以获得一些很好的资源来学习您需要知道的一切。

2022-02-25