我正在设置一个新的服务器,并希望在我的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多字节字符串函数。

其他回答

我刚刚经历了同样的问题,并在PHP手册中找到了一个很好的解决方案。

我把所有文件的编码改为UTF8,然后是连接上的默认编码。这解决了所有的问题。

if (!$mysqli->set_charset("utf8")) {
    printf("Error loading character set utf8: %s\n", $mysqli->error);
} else {
   printf("Current character set: %s\n", $mysqli->character_set_name());
}

查看源代码

我最近发现,使用strtolower()可能会导致数据在特殊字符之后被截断的问题。

解决办法就是使用

mb_strtolower($string, 'UTF-8');

mb_使用MultiByte。它支持更多的字符,但总体来说有点慢。

警告:此答案适用于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"));

我唯一想要补充的是,强调以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多字节字符串函数。

在我的例子中,我使用的是mb_split,它使用正则表达式。因此,我还必须手动确保正则表达式编码是UTF-8通过做mb_regex_encoding('UTF-8');

作为旁注,我还通过运行mb_internal_encoding()发现内部编码不是UTF-8,我通过运行mb_internal_encoding("UTF-8");来改变这一点。