„Konsequente Nutzung der UTF-8-Kodierung'
P粉752479467
P粉752479467 2023-08-21 21:15:56
0
2
411

Ich richte einen neuen Server ein und möchte vollständige UTF-8-Unterstützung in meiner Webanwendung. Ich habe dies schon einmal auf bestehenden Servern versucht, musste aber immer auf ISO-8859-1 zurückgreifen.

Wo muss ich die Kodierung/den Zeichensatz einstellen? Ich weiß, dass ich Apache, MySQL und PHP konfigurieren muss, um dies zu erreichen. Gibt es eine Standard-Checkliste, der ich folgen kann, oder wo Abweichungen ausgeschlossen werden können?

Dies ist ein neuer Linux-Server, auf dem MySQL 5, PHP 5 und Apache 2 ausgeführt werden.

P粉752479467
P粉752479467

Antworte allen (2)
P粉696605833

我想对chazomaticus的优秀回答补充一点:

也不要忘记META标签(像这样,或者HTML4或XHTML版本):

这似乎是微不足道的,但是IE7之前给我带来了问题。

我做的一切都是正确的;数据库、数据库连接和Content-Type HTTP头都设置为UTF-8,在所有其他浏览器中都正常工作,但是Internet Explorer仍然坚持使用"西欧"编码。

结果发现页面缺少META标签。添加了之后问题解决了。

编辑:

W3C实际上有一个相当大的专门用于I18N的部分。他们有很多与此问题相关的文章 - 描述了HTTP、(X)HTML和CSS方面的内容:

他们建议同时使用HTTP头和HTML meta标签(或在作为XML提供的XHTML的情况下使用XML声明)。

    P粉151720173

    数据存储:

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

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

    数据访问:

    • 在应用程序代码(例如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'); // 面向对象风格 mysqli_set_charset($link, 'utf8mb4'); // 过程化风格
      • 如果您只能使用纯mysql,但是碰巧运行的是PHP ≥ 5.2.3,您可以调用mysql_set_charset

    • 如果驱动程序没有提供自己的设置连接字符集的机制,您可能需要发出查询以告诉MySQL应用程序希望如何对连接上的数据进行编码:SET NAMES 'utf8mb4'

    • 与上述相同的关于utf8mb4/utf8的考虑。

    输出:

    • 在HTTP头中应设置UTF-8,例如Content-Type: text/html; charset=utf-8。您可以通过在php.ini中设置default_charset(首选)或手动使用header()函数来实现。
    • 如果您的应用程序将文本传输给其他系统,它们也需要被告知字符编码。对于Web应用程序,浏览器必须被告知数据发送的编码方式(通过HTTP响应头或HTML元数据)。
    • 使用json_encode()对输出进行编码时,将JSON_UNESCAPED_UNICODE作为第二个参数添加。

    输入:

    • 浏览器将以文档指定的字符集提交数据,因此在输入方面不需要特别处理。
    • 如果您对请求编码有疑问(例如它可能被篡改),在尝试存储或在任何地方使用之前,您可以验证每个接收到的字符串是否为有效的UTF-8。PHP的mb_check_encoding()可以做到这一点,但您必须要严格使用它。实际上没有绕过此问题的方法,因为恶意客户端可以以任何他们想要的编码提交数据,而我没有找到一个可靠地让PHP为您执行此操作的方法。

    其他代码注意事项:

    • 显然,您将提供的所有文件(PHP、HTML、JavaScript等)都应以有效的UTF-8进行编码。

    • 您需要确保每次处理UTF-8字符串时都要安全进行。这是非常困难的部分。您可能需要广泛使用PHP的mbstring扩展。

    • PHP的内置字符串操作默认情况下不是UTF-8安全的。您可以使用普通的PHP字符串操作(如连接)来安全地执行某些操作,但对于大多数操作,您应该使用等效的mbstring函数。

    • 要了解自己在做什么(即:不要搞砸),您真的需要了解UTF-8以及它在最低级别上的工作方式。查看utf8.com上的任何链接,以获取学习所需的一切的好资源。

      Neueste Downloads
      Mehr>
      Web-Effekte
      Quellcode der Website
      Website-Materialien
      Frontend-Vorlage
      Über uns Haftungsausschluss Sitemap
      Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!