一、什么是多字节字符串操作?其实很多同学可能已经用过了,但我们还是要从最基本的问题入手。每个字符的字节数并不是它看起来的那样。通常,英语中的数字或符号占用一个字节。但是世界上有这么多的语言,特别是中文和日文,它们不能放进一个字节,这就是需要多字节的地方(多字节通常是第一个字节的前导字节来表示当前的语言文本,后面是正在使用的字节编码)。例如,一个中文字符在 gbk 环境中占两个字节,在 utf-8中占三个字节。近年来 utf-8mb4,一种用于表情符号的四字节编码格式,由于表情符号的出现而变得越来越流行。虽然字节的不同设置可以帮助我们展现丰富的内容,但是对它的一些操作也会带来麻烦。
二、字符串操作
1
2
$str = "abc测试一下";
echo strlen($str), PHP_EOL; // 15
strlen() 函数大家都不陌生,但是对于中文来说,它返回的数量明显是不对的。我们当前默认的编码格式是 UTF-8 ,所以将一个中文当做三个英文字符来数就正好是 15 个字符长度。很明显,这不是我们想要的结果,假设我们要截取字符串的话,这个长度的计算可是很费劲的,搞不好还容易出现乱码。
幸好在 PHP 的默认扩展中就已经为我们准备好了一组 mb_ 函数库,专门用来处理这类多字节字符串的问题。
1
2
echo mb_strlen($str), PHP_EOL; // 7
echo mb_strlen($str, 'GB2312'), PHP_EOL; // 11
在不指定 mb_strlen() 函数的第二个参数的情况下,会按照当前文档的默认编码格式来进行转换,所以我们的字符串长度就在 UTF-8 的环境下正常显示了。当然,我们也可以指定第二个参数为其它的编码格式,比如以前常用的 GB2312 或者 GBK ,这样返回的字符长度就是以一个中文占两个字节的形式返回长度了。
1
2
3
4
5
6
var_dump(mb_strpos($str, "测")); // int(3)
var_dump(mb_convert_case($str, MB_CASE_UPPER)); // string(15) "ABC测试一下"
var_dump(mb_convert_case($str, MB_CASE_LOWER)); // string(15) "abc测试一下"
var_dump(mb_substr($str, 5)); // string(6) "一下"
当然,mb_相关的字符串操作函数比较全面,字符出现位置、大小写转换、字符串截取等函数都有提供,调用的参数与普通的字符串操作函数没有什么区别,只是有一个指定编码的可选参数。正常情况下,只要我们的文件是对应的编码格式,这个参数就不用写了。
以上就是成都大数据培训之PHP多字节字符串操作的详解,如果想了解更多详情,请点击成都加米谷大数据官网吧!成都大数据培训学校、大数据开发培训、数据分析与挖掘,零基础班本月正在招生中,课程大纲及试学视频可联系客服获取!http://www.dtinone.net/