P粉1847475362023-08-22 15:24:08
我想对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 meta标签(或在以XML形式提供的XHTML的情况下使用XML声明)。
P粉0329772072023-08-22 11:53:19
数据存储:
在数据库中的所有表和文本列上指定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中指定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
的考虑也适用于此。
输出:
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上的任何链接,了解您需要知道的一切。