我正在安装一台新服务器,希望在我的web应用程序中完全支持UTF-8.我过go 曾在现有服务器上try 过这一点,但最终似乎不得不回到ISO-8859-1.

我需要在哪里设置编码/字符集?我知道我需要配置Apache、MySQL和PHP来实现这一点——我是否可以遵循一些标准 list ,或者在出现不匹配的地方进行故障排除?

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

推荐答案

Data Storage:

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

  • 在较旧版本的MySQL(<;5.5.3)中,不幸的是,您将被迫使用simply utf8,它只支持Unicode字符的一个子集.我希望我是在Jest .

Data Access:

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

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

    • 如果你在PHP中使用PDO抽象层≥ 5.3.6,您可以在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的同样考虑也适用于上述情况.

Output:

  • 如果您的应用程序将文本传输到其他系统,则还需要通知它们字符编码.对于Web应用程序,必须通知浏览器发送数据的编码(通过HTTP响应头或HTML metadata).

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

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

Input:

  • 不幸的是,在try 存储或在任何地方使用它之前,都应该验证每个接收到的字符串是否有效.PHP的mb_check_encoding()实现了这一点,但你必须虔诚地使用它.真的没有办法解决这个问题,因为恶意客户端可以以他们想要的任何编码提交数据,而我还没有找到让PHP可靠地为您完成这项工作的诀窍.

  • 从我对当前HTML spec条的阅读来看,以下子项目符号对于现代HTML来说不再是必要的,甚至不再有效.我的理解是,浏览器将使用并提交文档指定字符集的数据.但是,如果您针对的是较旧版本的HTML(XHTML、HTML4等),以下几点可能仍然有用:

    • For HTML before HTML5 only:您希望浏览器发送给您的所有数据都是UTF-8格式.不幸的是,如果要可靠地做到这一点,唯一的方法就是将accept-charset属性添加到所有<form>个标记中:<form ... accept-charset="UTF-8">.
    • For HTML before HTML5 only:请注意,W3CHTML规范规定客户端"应该"默认使用服务器提供的任何字符集将表单发送回服务器,但这显然只是一个建议,因此需要在每个<form>个标记上显式显示.

Other Code Considerations:

  • 显然,您将提供的所有文件(PHP、HTML、JavaScript等)都应该使用有效的UTF-8编码.

  • 您需要确保每次处理UTF-8字符串时都是安全的.不幸的是,这是最困难的部分.您可能希望广泛使用PHP的mbstring扩展.

  • PHP's built-in string operations are not by default UTF-8 safe.使用普通的PHP字符串操作(比如连接)可以安全地完成一些事情,但对于大多数事情,应该使用等效的mbstring函数.

  • 要知道您在做什么(请阅读:不要搞砸),您真的需要了解UTF-8以及它是如何在尽可能低的级别上工作的.查看从utf8.com开始的任何链接,获得一些好的资源,以了解您需要了解的一切.

Php相关问答推荐

Symfony序列化程序未序列化所有类字段

如何在PHP中将浮点数转换为其IEEE754十六进制字符串?

基于产品变化自定义字段自定义WooCommerce低库存邮箱内容

仅显示特定WooCommerce产品类别的额外产品字段

根据类别在WooCommerce中添加库存数量后缀

用户信息更新期间Laravel邮箱验证问题

PHP Perl正则表达式—URL前面没有等号和可能的单引号或双引号

如果再次调用SESSION_START(),会话.gc-max是否会重新启动?或者它是从第一次创建会话开始计算的?

从WooCommerce购物车和 checkout 页面自定义发货标签

PHP中的圆生成器在国际日期变更线上失败

在WooCommerce中设置带有国家/地区和年份前缀的顺序序号

用于计算付款费用的WooCommerce管理编辑产品中的自定义复选框

添加并显示单价字段到WooCommerce产品变化

使用php ZipArhive类将Zip压缩文件分成多个部分

我有一个显示记录的表格,每行在最右边有两个按钮.如何才能以正确的顺序获得表的值?

如何按类别过滤自定义帖子类型

防止同时从Laravel中的用户帐户中提取

Google Drive API 服务->文件->get('root') 失败并显示找不到文件. (范围问题?)

Laravel 测试 assertJsonMissing 不适用于唯一的键.为什么?

使用php删除数组中相同数字的所有变体