在PHP中使用UTF-8字符集 - 是否需要mb函数?

时间:2009-11-16 19:55:25

标签: php utf-8 multibyte-functions

过去几天我一直致力于将我的PHP代码库从latin1转换为UTF-8。我读过两个主要的解决方案是用内置的多字节函数替换单字节函数,或者在php.ini文件中设置mbstring.func_overload值。

但后来我在堆栈溢出时遇到了this线程,其中thomasrutter的帖子似乎表明UTF-8实际上不需要多字节函数,只要编写脚本和字符串文字即可在UTF-8中。

我还没有找到任何其他证据证明这是否属实,如果事实证明我不需要将我的代码转换为mb_functions那么这将是一个真正的节省时间!有人能够对此有所了解吗?

8 个答案:

答案 0 :(得分:10)

据我所知,只要你的所有数据在utf-8中都是100% - 这意味着用户输入,数据库,以及PHP文件本身的编码,如果你有特殊字符 - 对于搜索和比较操作,这是 true true 。正如@ntd所指出的,当在包含多字节字符的字符串上运行时,非多字节strlen()将产生错误的结果。

THis是关于编码基础知识的精彩文章。

答案 1 :(得分:4)

除非您使用functions they replace中的任何一个(并且很可能 使用至少其中一个)或者明确需要某个功能,否则它们不是“必需的”扩展名如HTTP handling

在努力遵守UTF-8时,我总是回到PHP UTF-8 Cheatsheet并添加一个:需要更新PCRE模式以使用u修饰符。

答案 2 :(得分:3)

一旦检查或修改多字节字符串,就需要使用mb_ *函数。一个非常快速的例子,说明了原因:

$str = "abcžđščćöçefg";
mb_internal_encoding("UTF-8");

echo "strlen: ".strlen($str)."\n";
echo "mb_strlen: ".mb_strlen($str)."\n";

打印出来:

strlen: 20
mb_strlen: 13

答案 3 :(得分:2)

thomasrutter表示搜索不需要特殊处理。例如,如果您需要检查UTF8字符串的长度,我看不出如何使用普通strlen()来执行此操作。

答案 4 :(得分:2)

mb_strtoupper等功能也可能是必要的。 strtoupper不会将á转换为Á。

答案 5 :(得分:1)

有许多函数希望字符串是单字节(有些甚至假设它是iso-8859-1)。在这些情况下,您需要了解您正在做什么,并可能使用替换功能。在http://www.phpwact.org/php/i18n/utf-8

有一个相当全面的列表

答案 6 :(得分:0)

您可以使用扩展PHP中多字节函数的mbfunctions库:

http://code.google.com/p/mbfunctions/

答案 7 :(得分:0)

你可以用它 http://php.net/manual/en/mbstring.overload.php 在php.ini文件中设置,因此您无需更改代码。

但要小心,因为并非所有字符串函数都会自动更改。 这是一个:http://php.net/manual/en/function.substr-replace.php