繁体   English   中英

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

[英]Using UTF-8 charset with PHP - are mb functions required?

这几天我一直在努力将我的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 Cheatsheet并添加一个:需要更新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字符串的长度,我看不到你如何使用plain strlen()来做到这一点。

mb_strtoupper等函数也可能是必需的。 strtoupper不会将á转换为Á。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM