分割gbk中文出现乱码的问题解决
2016-02-25 13:16
330 查看
近日遇到一个神奇的字“弢(tao)”。
具体的过程是这样的:
取得这个分割的结果。
和想象不同,结果居然是这样:
出现了乱码,而且莫名其妙的出现了一个空元素。
究其原因,原来这个字“弢”的gbk编码是8f7c,而|的ASCII是7c,这样explode就把弢的第二ASCII作为|切割了。
既然是双字节的问题,我们用mbstring解决好了。
可惜,php并没有mb_explode这种函数,找了找,找到一个mb_split。
没有声明编码的地方。仔细一看,他是通过mb_regex_encoding声明编码的。
于是写出以下的代码:
结果php报错,mb_regex_encoding不认识gbk,囧。
那就使用它认识的:
结果:
发现,这种方法并没有什么用处。、
至于原因?“弢”这个字居然不在GB2312的编码集里面!!!!!但是有这个字的编码集(GBK, GB18030)这个函数都不支持!!!!!
既然这个不好用,也许万能的正则表达式是ok的。于是得到以下代码:
结果:
好吧,我想多了。
现在研究一下,如何用正则描述这个场景。
参考一下,鸟哥大神的博客:分割GBK中文遭遇乱码的解决。遗憾的是,正则能力比较low的我,还是想不出来合适的正则表达式(如果有想出这个正则表达式的大神们,希望可以告诉我)。
没办法,思来想去,只好用substr了:
测试代码:
结果:
这样就可以得到正确的结果了。
具体的过程是这样的:
$list = explode('|', 'abc弢|bc'); var_dump($list);
取得这个分割的结果。
和想象不同,结果居然是这样:
array(3) { [0]=> string(4) "abc? [1]=> string(0) "" [2]=> string(2) "bc" }
出现了乱码,而且莫名其妙的出现了一个空元素。
究其原因,原来这个字“弢”的gbk编码是8f7c,而|的ASCII是7c,这样explode就把弢的第二ASCII作为|切割了。
既然是双字节的问题,我们用mbstring解决好了。
可惜,php并没有mb_explode这种函数,找了找,找到一个mb_split。
array mb_split ( string $pattern , string $string [, int $limit = -1 ] )
没有声明编码的地方。仔细一看,他是通过mb_regex_encoding声明编码的。
于是写出以下的代码:
mb_regex_encoding('gbk'); $list = mb_split('\|', 'abc弢|bc'); var_dump($list);
结果php报错,mb_regex_encoding不认识gbk,囧。
那就使用它认识的:
mb_regex_encoding('gb2312'); $list = mb_split('\|', 'abc弢|bc'); var_dump($list);
结果:
array(3) { [0]=> string(4) "abc? [1]=> string(0) "" [2]=> string(2) "bc" }
发现,这种方法并没有什么用处。、
至于原因?“弢”这个字居然不在GB2312的编码集里面!!!!!但是有这个字的编码集(GBK, GB18030)这个函数都不支持!!!!!
既然这个不好用,也许万能的正则表达式是ok的。于是得到以下代码:
var_dump(preg_match_all('/([^\|])*/', 'abc弢|bc', $matches)); var_dump($matches);
结果:
int(2) array(2) { [0]=> array(2) { [0]=> string(4) "abc? [1]=> string(2) "bc" } [1]=> array(2) { [0]=> string(1) "? [1]=> string(1) "c" } }
好吧,我想多了。
现在研究一下,如何用正则描述这个场景。
参考一下,鸟哥大神的博客:分割GBK中文遭遇乱码的解决。遗憾的是,正则能力比较low的我,还是想不出来合适的正则表达式(如果有想出这个正则表达式的大神们,希望可以告诉我)。
没办法,思来想去,只好用substr了:
function mb_explode($delimiter, $string, $encoding = null){ $list = array(); is_null($encoding) && $encoding = mb_internal_encoding(); $len = mb_strlen($delimiter, $encoding); while(false !== ($idx = mb_strpos($string, $delimiter, 0, $encoding))){ $list[] = mb_substr($string, 0, $idx, $encoding); $string = mb_substr($string, $idx + $len, null, $encoding); } $list[] = $string; return $list; }
测试代码:
$a = 'abc弢|bc'; var_dump(mb_explode('|', $a, 'gbk')); var_dump(mb_explode('bc', $a, 'gbk')); var_dump(mb_explode('弢', $a, 'gbk'));
结果:
array(2) { [0]=> string(5) "abc弢" [1]=> string(2) "bc" } array(3) { [0]=> string(1) "a" [1]=> string(3) "弢|" [2]=> string(0) "" } array(2) { [0]=> string(3) "abc" [1]=> string(3) "|bc" }
这样就可以得到正确的结果了。
相关文章推荐
- 关于Mysql查询带单引号及插入带单引号字符串问题
- yii2得到的数据对象转化成数组
- 电脑使用问题解决Point
- Django中从mysql数据库中获取数据传到echarts
- three.js加载obj模型
- 去除url中的重复参数和删除指定参数
- LINUX内核分析20133201
- java分割字符串
- 求第100002个素数
- 原生的强大DOM选择器querySelector
- 【yeah】做个LED镜前灯~
- Java核心技术学习笔记之三——Java中的控制流程for循环while循环
- mark一下,抽空来翻译
- C#实现简单的SmtpClient发送邮件
- MFC图形界面编程
- linux定时执行任务crontab命令用法
- iOS开发 获取图片点击位置的颜色
- React插件-测试工具集-克隆组件
- 对匿名函数的深入理解(彻底版)
- 【转】如何正确地处理时间