PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是1~3倍的差异了。

采用mb_strlen函数可以较好地解决这个问题。mb_strlen的用法和strlen类似,只不过它有第二个可选参数用于指定字符编码。例如得到UTF-8的字符串$str长度,可以用mb_strlen($str,’UTF-8′)。如果省略第二个参数,则会使用PHP的内部编码。内部编码可以通过mb_internal_encoding()函数得到,设置有两种方式:
1. 在php.ini中设置mbstring.internal_encoding = UTF-8
2. 调用mb_internal_encoding(“GBK”)

除了mb_strlen,还有很多切割函数,其中mb_substr是按字来切分字符,而mb_strcut是按字节来切分字符,但是都不会产生半个字符的现象。而且从函数切割对长度的作用也不同,mb_strcut的切割条件是小于strlen, mb_substr是等于strlen,看下面的例子,

$str = '我是一串比较长的中文-www.jefflei.com';
echo "mb_substr:" . mb_substr($str, 0, 6, 'utf-8');
echo "mb_strcut:" . mb_strcut($str, 0, 6, 'utf-8');

输出如下:

mb_substr:我是一串比较
mb_strcut:我是

需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php编译模块时加入mbstring的支持:
(1)编译时使用–enable-mbstring
(2)修改/usr/local/lib/php.inc
default_charset = “zh-cn”
mbstring.language = zh-cn
mbstring.internal_encoding =zh-cn

mbstring类库内容比较多,还包括mb_ send_ mail 之类的email处理函数等
配置mbstring扩展

首先确保php安装目录下的ext子目录存在php_mbstring.dll 文件。然后编辑php.ini文件:

;extension=php_mbstring.dll 去掉分号
extension=php_mbstring.dll

把输出处理程序设为mbstring对应。
;output_handler =
output_handler = "mb_output_handler"

设定文字集为UTF-8。
;default_charset = "iso-8859-1"
default_charset = "UTF-8"

设置mbstring的语言为Chinese
;mbstring.language = Japanese
mbstring.language = Chinese

设置mbstring的内部编码为UTF-8。
;mbstring.internal_encoding = EUC-JP
mbstring.internal_encoding = UTF-8

设置mbstring的输入文字编码为自动判别方式。
;mbstring.http_input = auto
mbstring.http_input = auto

把mbstring输出文字编码设为UTF-8。
;mbstring.http_output = SJIS
mbstring.http_output = UTF-8

激活mbstring的文字编码自动变换方式。
;mbstring.encoding_translation = Off
mbstring.encoding_translation = On

mbstring库 全称是Multi-Byte String 即各种语言都有自己的编码,他们的字节数是不一样的,目前php内部的编码只支持ISO-8859-*, EUC-JP, UTF-8其他的编码的语言是没办法在php程序上正确显示的。
解决的方法就是通过php的mbstring函数库来解决其安装是在编译php的时候加上--enable-mbstring=?
"="后面就是跟需要支持的语言,j具体参数如下:--enable-mbstring=cn for Simplified Chinese support, --enable-mbstring=tw for Traditional Chinese support, --enable-mbstring=kr for Korean support, --enable-mbstring=ru for Russian support, and --enable-mbstring=ja for Japanese support.“没有发现PHP 的扩展设置mbstring,而当前系统好像在使用宽字符集。没有mbstring
扩展的phpMyAdmin 不能正确识别字符串,可能产生不可意料的结果.”
这是因为我们在装PHP的时候没有把mbstring模块加上。
在win下很简单啦,只要到配置文件里把mbstring.dll前面的分号去掉,并把文件放到相应的地方就可以了,在linux下就不同了,但是也很简单。只要在编译PHP的时候加上参数
--with-mbstring --enable-mbstring=all

就可以了。

PHP多字节字符串处理函数mbstring函数库
标签: