Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中使用UTF-8字符集-是否需要mb函数?_Php_Utf 8_Multibyte Functions - Fatal编程技术网

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

在PHP中使用UTF-8字符集-是否需要mb函数?,php,utf-8,multibyte-functions,Php,Utf 8,Multibyte Functions,在过去的几天里,我一直在努力将我的PHP代码库从latin1转换为UTF-8。我读过两个主要的解决方案,要么用内置的多字节函数替换单字节函数,要么在php.ini文件中设置mbstring.func_重载值 但后来我遇到了堆栈上的线程溢出,thomasrutter的文章似乎指出,多字节函数对于UTF-8实际上是不必要的,只要脚本和字符串文本是用UTF-8编码的 我还没有找到任何其他证据证明这是真是假,如果结果证明我不需要将代码转换为mb_函数,那么这将是一个真正的时间节省!有人能解释一下吗?据我

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

但后来我遇到了堆栈上的线程溢出,thomasrutter的文章似乎指出,多字节函数对于UTF-8实际上是不必要的,只要脚本和字符串文本是用UTF-8编码的


我还没有找到任何其他证据证明这是真是假,如果结果证明我不需要将代码转换为mb_函数,那么这将是一个真正的时间节省!有人能解释一下吗?

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


是一篇关于编码基础知识的优秀文章。

thomasrutter指出,搜索不需要特殊处理。例如,如果您需要检查UTF8字符串的长度,我看不出如何使用plain
strlen()

进行检查,除非您使用了其中任何一个(很可能您至少使用了其中一个)或明确需要扩展的功能,例如


在努力实现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

有许多函数希望字符串是单字节的(有些函数甚至假定它是iso-8859-1)。在这些情况下,您需要知道自己在做什么,并可能使用替换功能。这里有一个相当全面的列表:

可能还需要诸如mb_strotupper之类的功能。strtoupper不会将á转换为Á。

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

您可以使用此 设置在php.ini文件中,因此不需要更改代码

但要小心,因为并非所有字符串函数都会自动更改。
这是一个:

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