文章插图
什么是多字节的字符串操作呢?其实不少的同学可能都已经使用过了,但我们还是要从最基础的问题说起 。
一个字符占几个字节并不是我们表面上看到的那样 。正常情况下,一个数字或英文以及英文符号都是占用一个字节的 。但是这个世界的语言文字何其之多,特别是像中文、日文这样的文字,往往用一个字节装不下,这时候就需要多字节来解决了(多字节一般第一个字节是前导字节表示当前是什么语言文字,后面的是正被的字节编码) 。比如说一个中文字在 GBK 环境是占用两个字节,而在 UTF-8 下则是占用三个字节 。而在最近几年,由于 emoji 表情的出现 UTF-8MB4 又成为了主流,在表示这些 emoji 表情字符的时候,往往又会使用 UTF-8MB4 这种占用四个字节的编码格式来表示 。
虽说字节的不同设置能够帮助我们展示丰富的内容,但对它的一些操作却也带来了麻烦 。
字符串操作$str = "abc测试一下";echo strlen($str), PHP_EOL; // 15strlen() 函数大家都不陌生,但是对于中文来说,它返回的数量明显是不对的 。我们当前默认的编码格式是 UTF-8 ,所以将一个中文当做三个英文字符来数就正好是 15 个字符长度 。很明显,这不是我们想要的结果,假设我们要截取字符串的话,这个长度的计算可是很费劲的,搞不好还容易出现乱码 。
幸好在 PHP 的默认扩展中就已经为我们准备好了一组 mb_ 函数库,专门用来处理这类多字节字符串的问题 。
echo mb_strlen($str), PHP_EOL; // 7echo mb_strlen($str, 'GB2312'), PHP_EOL; // 11在不指定 mb_strlen() 函数的第二个参数的情况下,会按照当前文档的默认编码格式来进行转换,所以我们的字符串长度就在 UTF-8 的环境下正常显示了 。当然,我们也可以指定第二个参数为其它的编码格式,比如以前常用的 GB2312 或者 GBK ,这样返回的字符长度就是以一个中文占两个字节的形式返回长度了 。
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_ 相关的字符串操作函数是比较全面的,字符出现位置、大小写转换、截取字符串等函数都是提供的,调用的参数也都和普通的字符串操作函数没什么区别,只是它们多了一个可选的指定编码的参数 。在通常的情况下,只要我们的文件是对应的编码格式,这个参数就不用去写了 。
当然,字符串的操作函数还有很多,这里就不一一列举了,大家可以自行查阅相关的文档 。
字符串正则操作既然说到了字符串的操作,正则相关的功能也是必不可少的,我们先看下使用默认的 preg_ 相关的函数操作中文的问题 。
$str = iconv('UTF-8', 'GB2312', $str);var_dump(preg_match("/[a-z]*测试/i", $str)); // int(0)var_dump(preg_replace("/[a-z]*测试/i","试试", $str)); // string(11) "abc???????"首先我们将测试用的字符串转换为 GB2312 的形式 。就像我们获取的外部接口可能返回的就是 GB2312 的编码的 。这时直接使用 preg_ 相关的函数是无法正确获得我们想要的结果的 。
mb_regex_encoding('GB2312');$pattern = iconv('UTF-8', 'GB2312', "[a-z]*测试");var_dump(mb_ereg($pattern, $str)); // int(1)var_dump(mb_eregi($pattern, $str)); // int(1)var_dump(mb_ereg_replace($pattern,"试试", $str)); // string(10) "试试???"var_dump(mb_eregi_replace($pattern,"试试", $str)); // string(10) "试试???"接下来我们通过 mb_ereg 相关的函数来进行正则的匹配和替换,就能正常的对不同编码的字符串进行操作了 。注意,我们需要指定 mb_regex_encoding() 函数,告诉当前默认的规划替换编码是 GB2312 ,同时,正则规则也要转换成对应的编码格式 。
以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!
「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助:- php解析html的方法 php获取html标签内容
- 新陶瓷杯子用之前如何处理
- string类型转日期类型 sqlserver字符串转日期格式
- php安装教程详解 php防sql注入函数
- 手机录音杂音消除app推荐 语音处理技术
- 老旧冰箱细菌处理方法
- 骑自行车抽筋后的处理方法
- 大理石地面防滑处理方法
- ios数组排序的技巧 ios字符串转数组的方法
- 马桶冲完水有啸叫声如何处理