我正在设置一个新的服务器,并希望在我的web应用程序中完全支持UTF-8。我过去在现有的服务器上尝试过这种方法,似乎总是不得不回到ISO-8859-1。
我到底需要在哪里设置编码/字符集?我知道我需要配置Apache、MySQL和PHP才能做到这一点--有没有一些标准的检查表可以让我遵循,或者在哪里出现不匹配的地方进行故障排除?
这是一个新的运行MySQL 5、PHP5和Apache2的服务器。
发布于 2008-11-11 05:43:05
数据存储
utf8mb4字符集。这使得MySQL可以物理地存储和检索以UTF-8原生编码的值。请注意,如果指定了utf8mb4排序规则(没有任何显式字符集),则MySQL将隐式使用utf8mb4_*编码。utf8,它只支持Unicode字符的子集。我希望我是在开玩笑。数据访问
utf8mb4。这样,当MySQL将数据传递给您的应用程序时,它不会从原生UTF-8进行转换,反之亦然。- If you're using the [PDO](http://www.php.net/manual/en/book.pdo.php) abstraction layer with PHP ≥ 5.3.6, you can specify `charset` in the [DSN](http://php.net/manual/en/ref.pdo-mysql.connection.php):$dbh =新PDO('mysql:charset=utf8mb4');
- If you're using [mysqli](http://www.php.net/manual/en/book.mysqli.php), you can call [`set_charset()`](http://php.net/manual/en/mysqli.set-charset.php):$mysqli->set_charset('utf8mb4');//面向对象风格mysqli_set_charset($link,'utf8mb4');//过程式风格
- If you're stuck with plain [mysql](http://php.net/manual/en/book.mysql.php) but happen to be running PHP ≥ 5.2.3, you can call [`mysql_set_charset`](http://php.net/manual/en/function.mysql-set-charset.php).如果驱动程序没有提供自己的设置连接字符集的机制,则可能必须发出一个查询来告诉MySQL应用程序期望如何编码连接上的数据:
utf8mb4/utf8的同样注意事项也适用于上述情况。输出
default_charset php.ini选项,或者自己手动发出Content-Type MIME标头,这只是工作量较多,但效果相同。json_encode()对输出进行编码时,添加JSON_UNESCAPED_UNICODE作为第二个参数。输入
在尝试存储或在任何地方使用之前,应验证每个接收到的字符串是否为有效的
mb_check_encoding()可以做到这一点,但你必须忠实地使用它。这真的是无计可施,因为恶意客户端可以提交他们想要的任何编码的数据,而且我还没有找到让PHP为你可靠地做到这一点的诀窍。从我对当前HTML spec的阅读来看,下面的子项目符号对于现代不再是必要的,甚至不再有效。我的理解是,浏览器将使用为文档指定的字符集并提交数据。但是,如果您的目标是旧版本的超文本标记语言(XHTML、HTML4等),这些要点可能仍然有用:
- _For HTML before HTML5 only_: you want all data sent to you by browsers to be in UTF-8. Unfortunately, if you go by the only way to reliably do this is add the `accept-charset` attribute to all your `<form>` tags: `<form ... accept-charset="UTF-8">`.
- _For HTML before HTML5 only_: note that the W3C HTML spec says that clients "should" default to sending forms back to the server in whatever charset the server served, but this is apparently only a recommendation, hence the need for being explicit on every single `<form>` tag.其他代码注意事项
mbstring扩展。mbstring函数。发布于 2008-11-12 19:27:01
我想向chazomaticus' excellent answer添加一件事
也不要忘记META标签(像这样,或者the HTML4 or XHTML version of it):
<meta charset="utf-8">这看起来微不足道,但IE7以前就给过我一些问题。
我做的一切都是对的;数据库、数据库连接和Content-Type HTTP头都设置为UTF-8,并且它在所有其他浏览器中都工作得很好,但是Internet Explorer仍然坚持使用“西欧”编码。
结果发现页面缺少META标签。加上这一点就解决了问题。
编辑:
W3C实际上有一个相当大的section dedicated to I18N。他们有许多关于这个问题的文章-描述HTTP,(X)HTML和CSS方面的东西:
他们建议同时使用HTTP标头和HTML meta标记(如果将XHTML用作XML,则使用XML声明)。
发布于 2008-11-10 21:30:36
除了在php.ini中设置default_charset之外,您还可以在任何输出之前使用header()从代码中发送正确的字符集:
header('Content-Type: text/html; charset=utf-8');只要您意识到大多数字符串函数不能与Unicode一起使用,并且有些函数可能完全用处理字符串,那么在PHP中使用Unicode是很容易的。PHP将"characters“视为1字节长。有时这是可以的(例如,explode()只查找字节序列并将其用作分隔符--因此您查找的实际字符并不重要)。但在其他情况下,当函数实际上设计为处理字符时,PHP不知道您的文本包含Unicode中的多字节字符。
phputf8是一个很好的签入库。这将重写所有的“坏”函数,因此您可以安全地处理UTF8字符串。也有像mbstring扩展这样的扩展可以帮你做到这一点,但我更喜欢使用这个库,因为它更便于移植(但我写的是大众市场的产品,所以这对我来说很重要)。但无论如何,phputf8可以在幕后使用mbstring来提高性能。
https://stackoverflow.com/questions/279170
复制相似问题