我正在设置一个新的服务器,并希望在我的web应用程序中完全支持UTF-8。我过去曾在现有的服务器上尝试过这种方法,但似乎总是不得不回到ISO-8859-1。
我到底需要在哪里设置编码/字符集?我知道我需要配置Apache、MySQL和PHP来做到这一点-是否有一些标准的检查表,我可以遵循,或者排除哪里发生了不匹配?
这是一个新的Linux服务器,运行MySQL 5, PHP, 5和Apache 2。
我正在设置一个新的服务器,并希望在我的web应用程序中完全支持UTF-8。我过去曾在现有的服务器上尝试过这种方法,但似乎总是不得不回到ISO-8859-1。
我到底需要在哪里设置编码/字符集?我知道我需要配置Apache、MySQL和PHP来做到这一点-是否有一些标准的检查表,我可以遵循,或者排除哪里发生了不匹配?
这是一个新的Linux服务器,运行MySQL 5, PHP, 5和Apache 2。
当前回答
我唯一想要补充的是,强调以UTF-8编码保存文件,我注意到浏览器接受这个属性,而不是设置UTF-8作为代码编码。任何像样的文本编辑器都会显示这一点。例如,notepad++有一个用于文件编码的菜单选项,它会显示当前的编码并允许您更改它。对于我所有的PHP文件,我使用UTF-8没有BOM。
前一段时间,有人让我为别人设计的PHP和MySQL应用程序添加UTF-8支持。我注意到所有的文件都是用ANSI编码的,所以我必须使用iconv来转换所有的文件,将数据库表更改为使用UTF-8字符集和utf8_general_ci排序,在连接后将' set NAMES utf8'添加到数据库抽象层(如果使用5.3.6或更早的版本)。否则,您必须在连接字符串中使用charset=utf8)并更改字符串函数以使用等价的PHP多字节字符串函数。
其他回答
对于chazomaticus的精彩回答,我想补充一点:
也不要忘记META标签(像这样,或者它的HTML4或XHTML版本):
<meta charset="utf-8">
这看起来微不足道,但IE7以前就给过我这样的问题。
我做的每件事都是对的;数据库、数据库连接和内容类型HTTP头都被设置为UTF-8,在所有其他浏览器中都能正常工作,但ie仍然坚持使用“西欧”编码。
结果发现这个页面缺少META标签。加上这个,问题就解决了。
编辑:
W3C实际上有相当大的一部分专门讨论I18N。他们有很多关于这个问题的文章——描述HTTP, (X)HTML和CSS方面的事情:
常见问题:更改(X)HTML页面编码为UTF-8 在HTML中声明字符编码 教程:XHTML, HTML和CSS中的字符集和编码 设置HTTP字符集参数
他们建议同时使用HTTP报头和HTML元标记(或者在XHTML作为XML的情况下使用XML声明)。
警告:此答案适用于PHP 5.3.5及以下版本。不要在PHP 5.3.6版本(2011年3月发布)或更高版本中使用它。 比较Palec的回答PDO + MySQL和破碎的UTF-8编码。
我发现了一个问题,有人使用PDO,答案是使用这个PDO连接字符串:
$pdo = new PDO(
'mysql:host=mysql.example.com;dbname=example_db',
"username",
"password",
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
如果你想让MySQL服务器来决定字符集,而不是PHP作为客户端(旧行为;最好,在我看来),尝试添加skip-character-set-client-handshake到my.cnf,在[mysqld]下,并重新启动mysql。
如果您使用的不是UTF-8,这可能会带来麻烦。
在PHP中,您需要使用多字节函数,或者打开mbstring.func_overload。这样,如果你的字符超过一个字节,像strlen这样的东西就可以工作。
你还需要确定你的回答的字符集。您可以像上面一样使用AddDefaultCharset,也可以编写返回标头的PHP代码。(或者你可以在你的HTML文档中添加一个META标签。)
我最近发现,使用strtolower()可能会导致数据在特殊字符之后被截断的问题。
解决办法就是使用
mb_strtolower($string, 'UTF-8');
mb_使用MultiByte。它支持更多的字符,但总体来说有点慢。