PHP中多字节字符串操作的示例分析

  介绍

小编给大家分享一下PHP中多字节字符串操作的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

前言

什么是多字节的字符串操作呢?其实不少的同学可能都已经使用过了,但我们还是要从最基础的问题说起。

一个字符占几个字节并不是我们表面上看到的那样。正常情况下,一个数字或英文以及英文符号都是占用一个字节的。但是这个世界的语言文字何其之多,特别是像中文,日文这样的文字,往往用一个字节装不下,这时候就需要多字节来解决了(多字节一般第一个字节是前导字节表示当前是什么语言文字,后面的是正被的字节编码)。比如说一个中文字在GBK环境是占用两个字节,而在utf - 8下则是占用三个字节。而在最近几年,由于emoji表情的出现UTF-8MB4又成为了主流,在表示这些emoji表情字符的时候,往往又会使用UTF-8MB4这种占用四个字节的编码格式来表示。

虽说字节的不同设置能够帮助我们展示丰富的内容,但对它的一些操作却也带来了麻烦。

字符串操作

str 美元;=,“abc测试一下“;   echo  strlen (str)美元,PHP_EOL;,//, 15

strlen()函数大家都不陌生,但是对于中文来说,它返回的数量明显是不对的。我们当前默认的编码格式是utf - 8,所以将一个中文当做三个英文字符来数就正好是15个字符长度。很明显,这不是我们想要的结果,假设我们要截取字符串的话,这个长度的计算可是很费劲的,搞不好还容易出现乱码。

幸好在PHP的默认扩展中就已经为我们准备好了一组mb_函数库,专门用来处理这类多字节字符串的问题。

echo  mb_strlen (str)美元,PHP_EOL;//, 7   echo  mb_strlen (str美元,& # 39;GB2312 # 39;),, 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)),,//,字符串(15),“ABC测试一下“   var_dump (mb_convert_case (str,美元,MB_CASE_LOWER)),,//,字符串(15),“abc测试一下“      var_dump (mb_substr (str美元,,5)),,//,字符串(6),“一下“

当然,mb_相关的字符串操作函数是比较全面的,字符出现位置,大小写转换,截取字符串等函数都是提供的,调用的参数也都和普通的字符串操作函数没什么区别,只是它们多了一个可选的指定编码的参数。在通常的情况下,只要我们的文件是对应的编码格式,这个参数就不用去写了。

当然,字符串的操作函数还有很多,这里就不一一列举了,大家可以自行查阅相关的文档。

字符串正则操作

既然说到了字符串的操作,正则相关的功能也是必不可少的,我们先看下使用默认的preg_相关的函数操作中文的问题。

str 美元;=,iconv (& # 39; utf - 8 # 39;,, & # 39; gb2312 # 39;,, str美元);      var_dump (preg_match (“/[a - z] *测试/我,,str美元)),,//,int (0)   var_dump (preg_replace (“/[a - z] *测试/我,“试试,,,str美元)),,//,字符串(11),“abc ? ? ? ? ? ? ?“

首先我们将测试用的字符串转换为GB2312的形式。就像我们获取的外部接口可能返回的就是GB2312的编码的。这时直接使用preg_相关的函数是无法正确获得我们想要的结果的。

mb_regex_encoding (& # 39; GB2312 # 39;);   $ pattern =, iconv (& # 39; utf - 8 # 39;,, & # 39; gb2312 # 39;,,“[a - z] *测试“);   var_dump (mb_ereg(美元模式,,str)美元);,//,int (1)   var_dump (mb_eregi(美元模式,,str)美元);,//,int (1)      var_dump (mb_ereg_replace($模式,“试试,,,str美元)),,//,字符串(10),“试试? ? ?“   var_dump (mb_eregi_replace($模式,“试试,,,str美元)),,//,字符串(10),“试试? ? ?“

接下来我们通过mb_ereg相关的函数来进行正则的匹配和替换,就能正常的对不同编码的字符串进行操作了。注意,我们需要指定mb_regex_encoding()函数,告诉当前默认的规划替换编码是GB2312,同时,正则规则也要转换成对应的编码格式。

mb_eregi相关的函数和mb_ereg其实没有本质上的区别,只是它不区分大小写了,就像怀孕的相关函数中我们写正则时的后缀符号我一样.ereg相关的函数都是不用写反斜杠的,在普通的函数中其实是已经被淘汰了的函数(性能没有怀孕的好,语法也有区别),大部分情况下都会直接使用怀孕的相关的函数来进行操作,不过如果是牵涉到多字节相关的问题,在mb_函数库中还是只有ereg这类的函数可以使用。

PHP中多字节字符串操作的示例分析