在 PHP 中使用 UTF-8 字符集 - 是否需要 mb 函数?
-
20-09-2019 - |
题
在过去的几天里,我一直致力于将我的 PHP 代码库从 latin1 转换为 UTF-8。我读过两个主要的解决方案,要么用内置的多字节函数替换单字节函数,要么在 php.ini 文件中设置 mbstring.func_overload 值。
但后来我遇到了 这 关于堆栈溢出的线程,thomasrutter 的帖子似乎表明,只要脚本和字符串文字以 UTF-8 编码,多字节函数实际上对于 UTF-8 来说并不是必需的。
我还没有找到任何其他证据证明这是否属实,如果事实证明我不需要将我的代码转换为 mb_functions 那么这将是一个真正的节省时间!有人能解释一下吗?
解决方案
据我了解的问题,只要您的所有数据是UTF-8 100% - 这意味着用户输入数据库,也是PHP的编码文件本身,如果你在他们有特殊字符 - 这是<击>真击>的真搜索和比较操作即可。作为@ntd指出,当含有多字节字符的字符串运行非多字节的strlen()会产生错误的结果。
这是在编码的基础知识一个伟大的文章。
其他提示
除非您使用其中任何一个,否则它们不是“必需的” 他们取代的功能 (很可能你 是 至少使用其中一个)或以其他方式明确需要扩展的功能,例如 HTTP 处理.
当努力实现 UTF-8 合规性时,我总是回到 PHP UTF-8 备忘单 补充一点:PCRE 模式需要更新才能使用 u
修饰符。
只要你检查或修改多字节字符串,你需要使用一个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
thomasrutter表示的搜索不需要特殊的处理。例如,如果您需要检查的UTF8字符串的长度,我看不出你如何能做到这一点使用普通strlen()
。
函数,如mb_strtoupper可能是必要的,也。 strtoupper不会转换A到A
有许多意想不到的字符串是单个字节(和一些甚至假定它是ISO-8859-1)的功能。在这种情况下,你需要知道你在做什么,可能使用替代功能。有一个相当全面的列表中: http://www.phpwact.org/php/ I18N / UTF-8
您可以使用在PHP延伸多字节功能mbfunctions库:
您可以使用此 http://php.net/manual/en/mbstring.overload.php 在php.ini文件中的设置,所以你不需要改变你的代码。
但要小心,因为不是所有的字符串函数会被自动更改。 这是一个: http://php.net/manual/en/function。 SUBSTR-replace.php