解决 PHP substr() 截取字符串时,中文出现乱码的问题
Apr 11, 2014
在 PHP 程序开发中,经常会执行字符串的截取操作,比如输出信息列表时,标题不宜过长,打印文章摘要时,也要执行一系列的字符串截取操作。
遇到这些需求时,我们经常会想到使用 substr() 方法来实现,substr() 对全英文字符串的截取是比较适合的,但字符串只要出现中文字符,就有可能导致 PHP substr 中文乱码.
因为中文 UTF-8 编码,每个汉字占 3 字节,而 GB2312 占 2 字节,英文占 1 字节,截取位数不准确,substr() 硬生生地将一个中文字符“锯”成两半,造成断开的字符会把其后的.. 拉过来一起做一个字,所以出现了 PHP substr 中文乱码 。
这种截取字符的结果,肯定不是我们想要的结果,这种出现 PHP substr 中文乱码的情况,可能会导致程序无法正常运行。解决办法主要有两种:
一、使用 mbstring 扩展库的 mb_substr() 截取就不会出现乱码了。
可以用 mb_substr()/mb_strcut() 这个函数,mb_substr()/mb_strcut() 的用法与 substr() 相似,只是在 mb_substr()/mb_strcut 最后要加入多一个参数,以设定字符串的编码,但是一般的服务器都没打开 php_mbstring.dll,需要在 php.ini 在把 php_mbstring.dll 打开。
1 |
|
如果未指定最后一个编码参数,会是三个字节为一个中文,这就是 utf-8 编码的特点,若加上 utf-8 字符集说明,所以,是以一个字为单位来截取的。
使用的时候要注意 php 文件的编码,和网页显示时的编码。使用这个 mb_substr 方法要事先知道字符串的编码,如果不知道编码,就需要判断,mbstring 库还提供了 mb_check_encoding 来检验字符串编码,但还不完善。
二、自己书写截取函数,但效率不如用 mbstring 扩展库来得高。下面是 ecshop 里面的截取 UTF-8 编码下字符串的函数。
1 | function sub_str($str, $length = 0, $append = true) |