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

具体的过程是这样的:

 $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"
}

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

分割gbk中文出现乱码的问题解决的更多相关文章

  1. Linux下Git命令中文显示乱码的问题解决:274\232\350\256\256\346\200\273\347\273\223

    使用git add添加要提交的文件的时候,如果文件名是中文,会显示形如274\232\350\256\256\346\200\273\347\273\223的乱码. 解决方案:在bash提示符下输入: ...

  2. pdf.js浏览中文pdf乱码的问题解决

    由于项目中需要支持移动设备在线浏览pdf,苹果还好,天生支持,但是安卓中就不行了,需要第三方组件的支持. 这里就找到了pdf.js,由于pdf数据太多,开始的时候没法一一测试,所以随便测试打开了几篇没 ...

  3. 关于python2.7从数据库读取中文显示乱码的问题解决

    #!/usr/bin/env python # _*_ coding:utf-8 _*_ import MySQLdb import sys str = raw_input("please ...

  4. Python 3下使用Matplotlib工具画图,中文显示乱码的问题解决

    import matplotlib.pyplot as plt import matplotlib as mpl mpl.rcParams['font.sans-serif']=['SimHei'] ...

  5. Java中FTPClient上传中文目录、中文文件名乱码问题解决方法【好用】

    转: Java中FTPClient上传中文目录.中文文件名乱码问题解决方法 问题描述: 使用org.apache.commons.net.ftp.FTPClient创建中文目录.上传中文文件名时,目录 ...

  6. GB2312、GBK和UTF-8三种编码以及QT中文显示乱码问题

    1.GB2312.GBK和UTF-8三种编码的简要说明 GB2312.GBK和UTF-8都是一种字符编码,除此之外,还有好多字符编码.只是对于我们中国人的应用来说,用这三种编码 比较多.简单的说一下, ...

  7. struts2中form提交到action中的中文参数乱码问题解决办法(包括取中文路径)

    我的前台页是这样的: <body>      <form action="test.action" method="post">     ...

  8. AJAX在GBK编码页面中传中文参数乱码的问题

    ---恢复内容开始--- 页面编码是GBK的情况下传递中文有乱码,解决方法如下: 在ajax传递前用若是Array,JSON,等其它对象,可用JSON.stringfy字符串序列化后,赋值给ajax传 ...

  9. MySQL 中文显示乱码以及中文查询条件返回0条结果的问题解决

      最近关于中文显示乱码的贴子比较多,所以也做了个总结: 可以参考一下杨涛涛版主的<各种乱码问题汇总>http://topic.csdn.net/u/20071124/08/3b7eae6 ...

随机推荐

  1. 转:对于linux下system()函数的深度理解(整理)

    这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数中调用的命令也都一切正常.就没理这个bug,以为 ...

  2. Android对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17761431),请尊重他人的辛勤劳动成果,谢谢! 我之前写 ...

  3. SSL 证书申请(居然还可以在淘宝上购买)

    免费的目前有 2 个国内的:免费SSL证书申请国外的:StartSSL™ Certificates & Public Key Infrastructure 备注:其实,国内的这家的根证书,也是 ...

  4. 给你讲个笑话,我是创业公司CEO

      文/办公室奇葩说(Office 78)一个在办公室较为正经的八卦号. 前几天你看见朋友圈刷屏的文章<给你讲个笑话:我是做互联网的>. 你心想,写文章的那人是傻逼吗?觉得做互联网就是个笑 ...

  5. 从windows server 2003中学到的事儿

    2003让我学会了几件事儿, 第一.自己会装系统了. 第二.知道很多选项是可以自己进行设置的.这点很重要,本来xp用得很习惯,然后很多都理所当然得认为,就应该是那个样子,可是,并不是的. 在2003不 ...

  6. Linux内核定时器

    Linux使用struct    timer_list来描述一个定时器. 重要成员: expires:定时时长 *function:超时执行函数名使用流程: 1.定义定时器变量 /*定义定时器变量结构 ...

  7. WebApi限制IP地址请求

    , );                     }                 }             }              ? true : false;         }    ...

  8. html(三)

    今天自己画了个安卓机器人,之前听徐大大讲过一次,查手册去动手的时候其实发觉不是很难,这种规则的图像还是很好画的,主要是用<div>标签和<span>标签去做的,通过CSS添加样 ...

  9. 使用ViewPager+Fragment来实现带滚动条的多屏滑动-IndicatorFragmentActivity

    转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/17201587 介绍 在android应用中,多屏滑动是一种很常见的风格,博主 ...

  10. Javascript:splice()方法实现对数组元素的插入、删除、替换及去重

    定义和用法 splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目. 注释:该方法会改变原始数组. 语法: Array.prototype.splice(index,count[,el ...