php处理多字节字符mbstring及编码转换iconv

来源:互联网 发布:阴阳路抄墓碑 知乎 编辑:程序博客网 时间:2024/05/18 01:27

由于php内部使用单字节形式存储数据。这使得php在处理多字节文字的时候先天欠缺。只要是对数据进行原样处理。不进行计数,截取等。一般问题也不大,不幸的是对中文等多字节字符的截取,计数是一个很常见的问题。为了避免有字符被截取一半的问题。因此引入了php库mbstring(Multibyte String)常用的有以下函数
mb_substr ( string $str , int $start [, int $length [, string $encoding ]] )
按编码$encoding将字符串$str进行截取。除了加了一个按编码之外。用法与substr一样。

mb_strlen ( string $str [, string $encoding ] )
按编码$encoding计算字符串$str的字数。除了加了一个编码外。用法与strlen()

mb_detect_encoding ( string $str [, mixed $encoding_list = mb_detect_order() [, bool $strict = false ]] )
检测字符串的编码的格式,$encoding_list是可能的列表,会提高侦测率。$strict指定是否严格模式

mb_convert_encoding ( string $str , string $to_encoding [, mixed $from_encoding ] )
将字符串$str从$from_encoding(省略)转换成$to_encoding

mbstring虽然完美解决了多字节字符处理,但是需要加载额外的扩展。效率也不算高。好在还有php内置的iconv。iconv可以转换几乎所的编码格式。
因此可以用iconv加内置函数对多字节进行处理。我们可以将字符串转换成固定字节的编码集如ucs-2,ucs-4等。然后统计总数后除以固定字节就可以了

$str ='使用PHP开发网站';//转换utf-8到固定长度的ucs-2$str = iconv('UTF-8','UCS-2',$str);//计算字符数echo strlen($str)/2;//截取字符echo iconv('UCS-2','UTF-8',substr($str,0,5*2));

mb_convert_encoding与iconv转换编码的区别
1、mb_convert_encoding() 该函数会根据内容自动识别编码,执行效率比iconv差
2、是iconv()在一些字符转换下会不正常,如iconv在转换字符”—”到gb2312
一般情况下用 iconv,只有当遇到无法确定原编码是何种编码,或者iconv转化后无法正常显示时才用mb_convert_encoding 函数。


0 0
原创粉丝点击