在gbkgb2312编码中如何使用j son_encode
在gbk/gb2312编码中如何使用json_encode/json_decode
J S ON是一种轻量级的数据交换格式完全语言无关但是采用了类似于C系列语言的约定更详细的介绍可以参考: http://json.org由于将数组/对象序列化为JS ON字符串的时候基本上只支持UTF-8/ASCII 而我们现在很多网站出于历史原因或者支持国产的原因采用了GBK/GB2312编码这个时候直接使用json_encode/json_decode的时候就可能会出问题了。
我们从B/S两个方面谈这个问题。
首先从B(Browser)方面来讲我们使用JSON作为和S(Server)数据交换的格式无论如何 S返回的JSON字符串都已经是Unicode的了 由于JavaScript内部采用了Unicode的编码 JavaScript会根据客户端的编码的不同而自动转化编码 J S ON的解析也就不成问题了。 比如:返回的数据是
"\u4e2d\u56fd\u4eba"
无论你的页面是GBK,还是UT F-8的都将可以正确解析为
“中国人"
比较简单的方式是调用Javascript的eval函数:
try{ eval("var ret = " +"\"\u4e2d\u56fd\u4eba\";") ; }catch(e) {} ; alert(ret) ;
再来看看S(Server)端 json_encode/json_decode会假定给定的数据是UTF-8编码的这儿就有几种思路了:
将数据转化为UTF-8编码的然后再调用json_encode,或者首先j son_decode,然后再转化为GBK编码的。
将数据urlencode这样所有的数据都是ASCII的了调用json_encode就没有问题了json_decode之后也需要urldecode下。自己编写函数将GBK编码直接转换为uni code代码。
其实第一种和第二种都是同样的思路 即将其编码转换为可encode的编码下面看看上面提到的解决方案的具体代码:encode之前转换为utf-8,decode之后转回gbk:function tb_json_encode($value, $options = 0)
{return json_encode(tb_json_convert_encoding($value, "GBK","UTF-8")) ;
}function tb_json_decode($str, $assoc = false, $depth = 512){return tb_json_convert_encoding(json_decode($str, $assoc) ,"UTF-8", "GBK") ;
}function tb_json_convert_encoding($m, $from, $to){switch(gettype($m)) {case ' integer' :case 'boolean' :case 'float' :case 'double' :case 'NULL' :return $m;case ' string' :return mb_convert_encoding($m, $to, $from) ;case 'object' :
$vars = array_keys(get_object_vars($m)) ;foreach($vars as $key) {
$m->$key = tb_json_convert_encoding($m->$key,$from , $to) ;
}return $m;
' 'case array :foreach($m as $k => $v) {
$m[tb_json_convert_encoding($k, $from, $to) ] =tb_json_convert_encoding($v, $from, $to) ;
}return $m;
default:
}return $m;
}encode之前urlencode,decode之后urldecode:function tb_json_encode(array $value, $options = 0) {array_walk_recursive($value, 'tb_json_encode' ) ;return $value;
}function tb_json_decode($value, $assoc = false, $depth = 512){array_walk_recursive($value, 'tb_json_decode' ) ;return $value;
}function tb_urlencode(&$value, &$key) {
$key = urlencode($key) ;
$value = urlencode($value) ;
}function tb_urldecode(&$value, &$key) {
$key = urldecode($key) ;
$value = urldecode($value) ;
}
第三种方式在这儿就不详细介绍了。
参考:http://gggeek.altervista.org/sw/article_20061113.htmlhttp://json.org
经过测试发现PHP的递归实现是在是太慢了于是尝试将地一种方案修改成了使用PHP内置的函数,相比而言要好很多:function tb_json_encode_ex($value, $options = 0)
{array_walk_recurs ive($value,
"tb_json_convert_encoding_g2u") ;return json_encode($value) ;
}function tb_json_decode_ex($value, $assoc=true, $depth=512){
$value = json_decode($value) ;array_walk_recurs ive($value,
"tb_json_convert_encoding_u2g") ;return $value;
}function tb_json_convert_encoding_g2u(&$value, &$key)
{
$value = mb_convert_encodi ng($value, "UTF-8", "GBK") ;}function tb_json_convert_encoding_u2g(&$value, &$key)
{
$value = mb_convert_encodi ng($value, "GBK", "UTF-8") ;}
事实上第一种方式有一个优点是和基本的json_decode兼容而第二种则不行。
第二种方式还可以有好多"变种" 比如使用
base64_encode/base64_decode等等。
ucloud美国云服务器怎么样?ucloud是国内知名云计算品牌服务商家,目前推出全球多地机房的海外云服务器。UCloud主打的优势是海外多机房,目前正在进行的2021全球大促活动参与促销的云服务器机房就多达18个。UCloud新一代旗舰产品快杰云服务器已上线洛杉矶节点,覆盖北美和亚太地区,火热促销中, 首月低至7元,轻松体验具备优秀性能与极高性价比的快杰云服务器。点击进入:ucloud美国洛杉矶...
Virtono最近推出了夏季促销活动,为月付、季付、半年付等提供9折优惠码,年付已直接5折,而且下单后在LET回复订单号还能获得双倍内存,不限制付款周期。这是一家成立于2014年的国外VPS主机商,提供VPS和服务器租用等产品,商家支持PayPal、信用卡、支付宝等国内外付款方式,可选数据中心包括罗马尼亚、美国洛杉矶、达拉斯、迈阿密、英国和德国等。下面列出几款VPS主机配置信息,请留意,下列配置中...
10gbiz发布了9月优惠方案,针对VPS、独立服务器、站群服务器、高防服务器等均提供了一系列优惠方面,其中香港/洛杉矶CN2 GIA线路VPS主机4折优惠继续,优惠后最低每月仅2.36美元起;日本/香港独立服务器提供特价款首月1.5折27.43美元起;站群/G口服务器首月半价,高防服务器永久8.5折等。这是一家成立于2020年的主机商,提供包括独立服务器租用和VPS主机等产品,数据中心包括美国洛...