在过去的几天里,我一直致力于将我的 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://code.google.com/p/mbfunctions/

您可以使用此 http://php.net/manual/en/mbstring.overload.php 在php.ini文件中的设置,所以你不需要改变你的代码。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top