在使用PHP时,是否需要使用mb函数来支持UTF-8字符集?

6
这些天来,我一直在将我的PHP代码库从Latin1转换为UTF-8。我读到的两个主要解决方案是要么使用内置的多字节函数替换单字节函数,要么在php.ini文件中设置mbstring.func_overload值。

但是我在stack overflow上看到this线程时,thomasrutter的帖子似乎表明多字节函数对于UTF-8实际上并不必要,只要脚本和字符串文字以UTF-8编码即可。

我没有找到其他证据证明这是否正确,如果事实证明我不需要将我的代码转换为mb_functions,那将节省大量时间!有人能给我指点吗?

8个回答

11
据我理解,只要您所有的数据都是100%的utf-8编码——这意味着用户输入、数据库,以及如果您的PHP文件中有特殊字符,则也包括PHP文件本身的编码,那么在搜索和比较操作方面,这是可行的。正如@ntd指出的那样,非多字节strlen()在运行包含多字节字符的字符串时会产生错误结果。 这篇文章对编码的基础知识进行了很好的阐述。

谢谢所有回复的人,我现在明白了。非常感谢! - Spoonface

4
除非您正在使用它们替代的函数之一(而且很可能您至少在使用其中一个),或者明确需要扩展功能,例如HTTP处理,否则它们不是“必需的”。
在努力实现UTF-8兼容性时,我总是回到PHP UTF-8备忘单,并添加一个内容:PCRE模式需要更新以使用u修饰符。

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

2

thomasrutter表示搜索不需要特殊处理。例如,如果您需要检查UTF8字符串的长度,我不认为您可以使用普通的strlen()来完成。


2

有些函数,比如mb_strtoupper可能也是必要的。使用strtoupper无法将á转换为Á。


1

有许多函数期望字符串是单字节的(有些甚至假定它是iso-8859-1)。在这些情况下,您需要注意自己在做什么,并可能使用替换函数。在这种情况下,您需要注意自己在做什么,并可能使用替换函数。在以下链接中有一个相当全面的列表:http://www.phpwact.org/php/i18n/utf-8


0

-1

不再使用:"此功能已自 PHP 7.2.0 起被弃用。依赖此功能是极其不鼓励的。" - Oliver N.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接