解决json_encode中文UNICODE转码问题
来源:互联网 发布:java电商架构设计 编辑:程序博客网 时间:2024/04/28 16:05
[使用场景1]
遇到问题: 我从表中取数据时, 发现表中有个字段是下面这种json形式的
{
"name"
:
"\u5927\u971e"
,
"sex"
:
"f"
}
原因:
由于, 用PHP的json_encode来处理中文的时候, 中文都会转化成Unicode编码, 变成不可读的, 类似”\u***”的格式,如下所示:
$arr
= [
'name'
=>
'大霞'
,
'sex'
=>
'f'
];
$str
= json_encode(
$arr
);
//下面的例子,我将使用到此变量
var_dump(
$str
);
打印结果如下:
string
'{"name":"\u5927\u971e","sex":"f"}'
那么我们如何解决这种问题那, 下面有3种解决办法,如下:
方法1:
//对unicode码再进行解码,解码函数如下:
function
decodeUnicode(
$str
)
{
return
preg_replace_callback(
'/\\\\u([0-9a-f]{4})/i'
,
create_function(
'$matches'
,
'return mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UCS-2BE");'
),
$str
);
}
$str
= decodeUnicode(
$str
);
结果如下:
string
'{"name":"大霞","sex":"f"}'
方法2:
$test
= preg_replace_callback(
'/\\\u([0-9a-f]{4})/'
,
function
(
$match
) {
return
iconv(
'UCS-2BE'
,
'UTF-8'
, pack(
'H4'
,
$match
[1]));
//抓取来的ucs-2编码的信息转码成utf-8格式的
},
$str
);
打印结果如下:
string
'{"name":"大霞","sex":"f"}'
方法3:
$str
=preg_replace(
"#\\\u([0-9a-f]{4})#ie"
,
"iconv('UCS-2BE', 'UTF-8', pack('H4', '\\1'))"
,
$str
);
打印结果如下:
string
'{"name":"大霞","sex":"f"}'
注意: preg_replace函数中的 "/e修饰符" 已经在php5.5.x版本中废除, 如果你是高版本将会报错如下(如果你是低版本的话,使用此方法)
preg_replace(): The /e modifier is deprecated,
use
preg_replace_callback instead
说明: 以上3中方法实现了将Unicode编码转化成中文的形式
1): preg_replace_callback() 需要PHP 4 >= 4.0.5, PHP 5
2): 第一种,第二种方法实现的是一样的,不同之处在于方法1中用到的create_function(PHP5.3以前),而方法2中用到匿名函数(PHP5.3以后), 但是我推荐使用方法2,因为方法1中使用的create_function函数里面是字符串的形式,不易于理解,而方法2中的匿名函数是以函数的形式,这更易于我们理解,所以我推荐使用方法2
3): 第三中方法, preg_replace函数中的 "/e修饰符" 已经在php5.5以上的版本中被废除.如果你是低版本,就可以使用此方法
[使用场景2] 我推荐这种形式 "存进表中的数据是中文, 那么取出的就是中文了".
升级PHP,在PHP5.4, 这个问题终于得以解决, Json新增了一个选项: JSON_UNESCAPED_UNICODE, 故名思议, 就是说, Json不要编码Unicode
$str
= json_encode(
$str
, JSON_UNESCAPED_UNICODE);
var_dump(
$str
);
打印结果如下:
string
'{"name":"大霞","sex":"f"}'
//这样我们存进去的是就是中文了,那么取出的也就是中文了
[使用场景3] 我们存进表中的汉字先urlencode然后再使用json_encode,将存进表中的数据如下所示
$arr
= [
'name'
=> urlencode(
"大霞"
),
'sex'
=>
'f'
];
$str
= json_encode(
$arr
);
var_dump(
$str
);
结果如下:
string
'{"name":"%E5%A4%A7%E9%9C%9E","sex":"f"}'
取出数据的时候,再次使用urldecode来解码,这样编码出来的json数组中的汉字就不会出现unicode编码了。
$str
= urldecode(
$str
);
打印结果如下:
string
'{"name":"大霞","sex":"f"}'
说明: 这种方法不是简单的方法, 在此仅仅是说明有此种方法而已,并不推荐使用
上面可能用到一些函数:
说明一下其他用到的函数:pack() 函数把数据装入一个二进制字符串。 语法 : pack(format,args+) format 必需。规定在包装数据时所使用的格式。 args+ 可选。规定被包装的一个或多个参数。iconv()函数库能够完成各种字符集间的转换,是php编程中不可缺少的基础函数库。 例如: $string = "大霞"; iconv("utf8","gbk",$string)//将字符串string 编码由utf8转变成gbk;
0 0
- 解决json_encode中文UNICODE转码问题
- 解决json_encode中文UNICODE转码问题
- php 解决json_encode中文UNICODE转码问题
- php 解决json_encode中文UNICODE转码问题
- php 解决json_encode中文UNICODE转码问题
- php 解决json_encode中文UNICODE转码问题
- php 解决json_encode中文UNICODE转码问题
- php 解决json_encode中文UNICODE转码问题
- php 解决json_encode中文UNICODE转码问题
- php 解决json_encode中文UNICODE转码问题
- json_encode中文Unicode转码问题
- json_encode中文unicode的问题
- php json_encode中文unicode问题
- PHP解决json_encode中文变成unicode编码
- 解决json_encode不支持中文问题
- php json_encode中文unicode编码问题
- php json_encode默认转码中文解决
- 解决PHP json_encode() 中文自动Unicode编码的函数
- 判断是不是空格
- BaseAdapter之给 RecyclerView添加HeaderView
- 【Html】垂直居中-父元素高度确定的单行文本
- MuPDF for Android编译过程小结
- CocoaPods的安装
- 解决json_encode中文UNICODE转码问题
- Discuz! 全局变量 $_G 详解
- 关于cell的复用的机制,防止cell之间的内容发生混乱
- mask应用之制作颜色渐变字体
- Git设置代理访问GitHub和Bitbucket
- 苹果app发布和真机调试流程(企业开发者版)
- 关于vim复制剪贴粘贴命令的总结
- java在并发场景使用SimpleDateFormate的问题
- leetcode -- Multiply Strings -- python容易处理,需要看其他解法