PHP字符串截取指定长度的方法选择差异及异常处理

PHP中常见的截取字符串substr()函数使用非常容易,但是有时针对中文截取时会出现乱码问题(主要是由于编码类型导致),可以通过mb_substr()处理,其差异在于需要指定文字字符集即可解决

PHP字符串截取指定长度的方法选择差异及异常处理

所属分类: PHP
专题标签: 字符串 截取 乱码

substr()函数

语法:substr(string,start,length)
说明:substr(字符串,开始坐标,长度)

  1. $str = '米虫先生真是个大帅比';
  2. echo substr($str,0,12);
  3. //输出结果为“米虫先生”

上面案例中明明输入了12位但实际只出现4个字?
中文UTF-8编码,每个汉字占3字节(一般情况下服务器都会习惯采用UTF编码)。
当然如果GB2312编码模式先,中文占2字节。
而英文则占1字节,基本上大部分编码模式下皆是如此。

substr()截取中文会出现乱码的问题

从上面结果里看,如果我指定长度为3的倍数一般不会有问题?
如果你的文本确认全是中文一般不会出现乱码问题,但如果字符串中包含英文、数字或者半角符号…
那在长度结尾处,substr()函数很有可能硬生生地将一个中文字符“锯”成两半,因此就产生了乱码问题。

mb_substr()函数

语法:substr(string,start,length,codetype)
说明:substr(字符串,开始坐标,长度,编码方式)

  1. $str = '米虫先生真是个大帅比';
  2. echo mb_substr($str,0,4,'UTF-8');
  3. //输出结果为“米虫先生”

为什么mb_substr()不会产生乱码

mbstring()函数截取内容时填入的长度为真实长度,即所见即所得的长度。
但需要指定正确的字符集!

  1. $str = '米虫Sir真是个大帅比';
  2. //输出结果为“米虫Sir”
  3. //并不会因为中英文混合场景进行长度计算
  4. echo mb_substr($str,0,5,'UTF-8');

关于网页字符集指定

mb_substr()函数来自mbstring扩展库,mb_strcut()也可以达成该效果。
使用mb_substr()函数的时候要注意php文件的编码以及网页显示时的编码。
建议统一使用UTF-8编码。
尽量不要通过txt打开或编写PHP和HTML文件。

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <!-- 指定网页编码 -->
  5. <meta charset="UTF-8">
  6. </head>
  7. <body>
  8. </body>
  9. </html>