300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 分割gbk中文出现乱码的有关问题解决

分割gbk中文出现乱码的有关问题解决

时间:2019-04-17 07:13:23

相关推荐

分割gbk中文出现乱码的有关问题解决

后端开发|php教程

string,encoding,array,list,explode

后端开发-php教程

分割gbk中文出现乱码的问题解决

html5后台框架源码,如何启动vscode,winrt ubuntu,tomcat加载过慢,sqlite上亿行查询,六月- 手机插件 商业版,前端开发 3D图形框架,商城数据爬虫插件下载不了,php表单提交跳转,淮南seo公司报价,网站程序开发群,易语言能制作网页吗,回复 html 模板lzw

近日遇到一个神奇的字“弢(tao)”。

开源分类目录网站源码,vscode无法运行npm,ubuntu网卡开关,tomcat 网站 调试,sqlite英文能换中文吗,网站中常见的爬虫类型,php 日期正则表达式,顺昌正规seo大概费用,网站大转盘,商业模板图片lzw

具体的过程是这样的:

彩票网站源码,vscode lua,ubuntu密码,tomcat jvm,sqlite事务,手机在线网页设计,mysql 数据库购买,服务器教程,淘宝颜色分类插件,前端框架 react,爬虫 登录,php 网站,seo诊断,springboot连接数据库,标签云的实现,传奇网站模板,网页设计模板下载,外贸网站模板,织梦后台文章删除不了,jquery 返回页面顶部,web版仓库管理系统,matlab 去马赛克程序lzw

1 $list = explode(|, abc弢|bc);2 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声明编码的。

于是写出以下的代码:

1 mb_regex_encoding(gbk);2 $list = mb_split(\|, abc弢|bc);3 var_dump($list);

结果php报错,mb_regex_encoding不认识gbk,囧。

那就使用它认识的:

1 mb_regex_encoding(gb2312);2 $list = mb_split(\|, abc弢|bc);3 var_dump($list);

结果:

array(3) { [0]=> string(4) "abc? [1]=> string(0) "" [2]=> string(2) "bc"}

发现,这种方法并没有什么用处。、

至于原因?“弢”这个字居然不在GB2312的编码集里面!!!!!但是有这个字的编码集(GBK, GB18030)这个函数都不支持!!!!!

既然这个不好用,也许万能的正则表达式是ok的。于是得到以下代码:

1 var_dump(preg_match_all(/([^\|])*/, abc弢|bc, $matches));2 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了:

1 function mb_explode($delimiter, $string, $encoding = null){ 2$list = array(); 3is_null($encoding) && $encoding = mb_internal_encoding(); 4$len = mb_strlen($delimiter, $encoding); 5while(false !== ($idx = mb_strpos($string, $delimiter, 0, $encoding))){ 6 $list[] = mb_substr($string, 0, $idx, $encoding); 7 $string = mb_substr($string, $idx + $len, null, $encoding); 8} 9$list[] = $string;10return $list; 11 }

测试代码:

1 $a = abc弢|bc;2 3 var_dump(mb_explode(|, $a, gbk));4 var_dump(mb_explode(c, $a, gbk));5 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"}

这样就可以得到正确的结果了。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。