分割gbk中文出现乱码的问题解决
近日遇到一个神奇的字“弢(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中文出现乱码的问题解决的更多相关文章
- 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提示符下输入: ...
- pdf.js浏览中文pdf乱码的问题解决
由于项目中需要支持移动设备在线浏览pdf,苹果还好,天生支持,但是安卓中就不行了,需要第三方组件的支持. 这里就找到了pdf.js,由于pdf数据太多,开始的时候没法一一测试,所以随便测试打开了几篇没 ...
- 关于python2.7从数据库读取中文显示乱码的问题解决
#!/usr/bin/env python # _*_ coding:utf-8 _*_ import MySQLdb import sys str = raw_input("please ...
- Python 3下使用Matplotlib工具画图,中文显示乱码的问题解决
import matplotlib.pyplot as plt import matplotlib as mpl mpl.rcParams['font.sans-serif']=['SimHei'] ...
- Java中FTPClient上传中文目录、中文文件名乱码问题解决方法【好用】
转: Java中FTPClient上传中文目录.中文文件名乱码问题解决方法 问题描述: 使用org.apache.commons.net.ftp.FTPClient创建中文目录.上传中文文件名时,目录 ...
- GB2312、GBK和UTF-8三种编码以及QT中文显示乱码问题
1.GB2312.GBK和UTF-8三种编码的简要说明 GB2312.GBK和UTF-8都是一种字符编码,除此之外,还有好多字符编码.只是对于我们中国人的应用来说,用这三种编码 比较多.简单的说一下, ...
- struts2中form提交到action中的中文参数乱码问题解决办法(包括取中文路径)
我的前台页是这样的: <body> <form action="test.action" method="post"> ...
- AJAX在GBK编码页面中传中文参数乱码的问题
---恢复内容开始--- 页面编码是GBK的情况下传递中文有乱码,解决方法如下: 在ajax传递前用若是Array,JSON,等其它对象,可用JSON.stringfy字符串序列化后,赋值给ajax传 ...
- MySQL 中文显示乱码以及中文查询条件返回0条结果的问题解决
最近关于中文显示乱码的贴子比较多,所以也做了个总结: 可以参考一下杨涛涛版主的<各种乱码问题汇总>http://topic.csdn.net/u/20071124/08/3b7eae6 ...
随机推荐
- 启动任务StartTask() 发送完消息队列 自己删除,接收方一直显示数据 用OSQFlush(Str_Q); //清空消息队列 下面纠结接收不到了 哈哈
在建立工程的时候,启动任务StartTask() 启动了任务MyTask(),也建立了消息队列,然后发送消息队列,发送完自己删除了自己,在接收方一直能接受到数据???为何??? 因为我们的消息队列未 ...
- 浅谈 “空指针、野指针、void*”
Author: JW. Zhou Date: 2014/7/2 一.空指针(0/NULL) 返回NULL和返回0是完全等价的,因为NULL和0都表示空指针,换句话说:空指针是什么,就是 ...
- ionic ng-src 在网页显示,但是导出apk在android手机中运行不显示图片
解决方法参照: http://stackoverflow.com/questions/29896158/load-image-using-ng-src-in-android-ionic-aplicat ...
- Delphi 自带的 Base64 编解码函数
今天帮别人解决一个关于 Base64 编解码的问题,竟然发现 Delphi 自带了 Base64 编解码的单元,叫 EncdDecd,这名字很拗口而且不直观,估计这是一直很少人关注和知道的原因. 这个 ...
- android数据保存
永久保存数据的方法:1.Shared Preferences 以键值对的形式存储基本数据类型( booleans, floats, ints, longs, and strings),存储的数据在限制 ...
- COJ 0802 非传统题(二)
(颓了这么多天是时候干点正事了QAQ) 非传统题(二) 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 还是很久很久以前,chx ...
- Sum
Problem Description XXX is puzzled with the question below: 1, 2, 3, ..., n (1<=n<=400000) are ...
- hdu 1860 统计字符
Problem Description 统计一个给定字符串中指定的字符出现的次数 Input 测试输入包含若干测试用例,每个测试用例包含2行,第1行为一个长度不超过5的字符串,第2行为一个长度不超过8 ...
- AES的S-BOX构造优化
之前写过SBOX的构造,后来看到别人的优秀思路,借鉴过来重新改了一点. 原文地址:http://www.cnblogs.com/7hat/p/3383546.html 主要是将矩阵运算改为列运算之和, ...
- 行内人解读开发一个App需要多少钱?
对于很多互联网的创业者来说,评估前期的创业成本是很重要的.在这几年的创业大潮中,伴随着“互联网+”和“互联网思维”的普及,很多创业项目选择了开发app作为创业项目的载体.在我接触到的很多创业者,找Ap ...