当使用php自带的json_encode对数据进行编码时,中文都会变成unicode,导致不可读。如:对字符串”厦门“进行json_encode后,输出的是"\u53a6\u95e8"。
u5fae\u535a\u6700\u65b0\u66f4\u65b0为unicode 编码大多数在 js 或者 json 里面常见~
查询了一下,有两种方法:
1.将"\u53a6\u95e8"还原成“厦门”,使用如下的代码:
$str= preg_replace("#\\\u([0-9a-f]+)#ie", "iconv('UCS-2', 'UTF-8', pack('H4', '\\1'))", $str);
2.先将中文字段urlencode,json_encode后,再用urldecode,也可以显示中文。
$code = urldecode(json_encode(urlencode("厦门")));
PHP5.4版本,已经给Json新增了一个选项: JSON_UNESCAPED_UNICODE。加上这个选项后,就不会自动把中文编码了。
echo json_encode("厦门", JSON_UNESCAPED_UNICODE);
另,由于 json_encode 和 json_decode只支持utf-8编码的字符,GBK的字符要用json就得转换一下,附自己写的GBK转UTF-8的代码:
/* 字符串GBK转码为UTF-8,数字转换为数字。 */ function ct2($s){ if(is_numeric($s)) { return intval($s); } else { return iconv("GBK","UTF-8",$s); } } /* 批量处理gbk->utf-8 */ function icon_to_utf8($s) { if(is_array($s)) { foreach($s as $key => $val) { $s[$key] = icon_to_utf8($val); } } else { $s = ct2($s); } return $s; } echo json_encode(icon_to_utf8("厦门"))
Server.UrlDecode(); Server.UrlEncode(); 是两个成对的方法 作用是在URL传参时如果直接传中文可能会出问题(对中文参数支持部完善),所以先用 Server.UrlEncode("中文参数")编码 到另外一个页面接受的时候在用Server.UrlDecode("编码后参数一般为 %+ 16进制数的形式");解码获取中文参数
今天在用HttpClient的PostMethod模拟浏览器用表单的post方法发送数据给服务器的时候,如果数据是中文,服务器接收的是乱码,然后看了很多乱码的文章,最后解决了,现在总结下.
1.首先搞清楚客户端是用那种编码方式将数据编码后提交的.
浏览器在form提交后,会生成一个HTTP的头部信息"content-type",标准规定其形式为Content-type: application/x-www-form-urlencoded; charset=UTF-8
这样服务器端就可以知道form里的字符是怎么编码的了。 要注意的是这里的charset=UTF-8是默认的,如果这个HTML代码里有<meta http-equiv="Content-Type" content="text/html; charset=GBK" />,那么此HTML的form表单将以GBK的编码方式提交数据,其实表单提交数据使用的编码方式是可以指定的.那现在用HttpClient,根本就没有浏览器和具体的HTML代码,其实HttpClient的PostMethod对象里已经有设定编码方式的方法
这里的编码方式可以随意指定,开始就是因为没有写这段,采用了Httpclient默认的编码方式,所以出现乱码,这里设置编码方式的方法也不唯一.ajax使用post方法提交数据的编码方式的设定也和这个类似.
2.服务器端是如何选择那种编码方式来对数据进行解码的呢.
首先我用request.getCharacterEncoding()来看表单提交数据所使用的编码方法,奇怪的是用浏览器提交request.getCharacterEncoding()是null,而用HttpClient提交request.getCharacterEncoding()的值是UTF-8,和客户端指定的编码方式一致,后来google了下,原来是浏览器做的手脚,IE是不将表单提交数据使用的编码方式写到HTTP头部发送出去的.我发现如果用HttpClient的post提交数据,编码方式指定的话,request.getCharacterEncoding()是能得到值的,而且request对象也用此编码方式解码,不用request.setCharacterEncoding("")指定;如果request.getCharacterEncoding()是null,就要request.setCharacterEncoding("")指定编码方式,要和你提交时设定的编码方式一致.然后request.getParameter("")的值就是你想要的了.(这里有可能有误的地方请指出)
1.首先搞清楚客户端是用那种编码方式将数据编码后提交的.
浏览器在form提交后,会生成一个HTTP的头部信息"content-type",标准规定其形式为Content-type: application/x-www-form-urlencoded; charset=UTF-8
这样服务器端就可以知道form里的字符是怎么编码的了。 要注意的是这里的charset=UTF-8是默认的,如果这个HTML代码里有<meta http-equiv="Content-Type" content="text/html; charset=GBK" />,那么此HTML的form表单将以GBK的编码方式提交数据,其实表单提交数据使用的编码方式是可以指定的.那现在用HttpClient,根本就没有浏览器和具体的HTML代码,其实HttpClient的PostMethod对象里已经有设定编码方式的方法
- PostMethod post = new PostMethod("http://iteye.com");
- post.setRequestHeader("ContentType","application/x-www-form-urlencoded;charset=UTF-8");
2.服务器端是如何选择那种编码方式来对数据进行解码的呢.
首先我用request.getCharacterEncoding()来看表单提交数据所使用的编码方法,奇怪的是用浏览器提交request.getCharacterEncoding()是null,而用HttpClient提交request.getCharacterEncoding()的值是UTF-8,和客户端指定的编码方式一致,后来google了下,原来是浏览器做的手脚,IE是不将表单提交数据使用的编码方式写到HTTP头部发送出去的.我发现如果用HttpClient的post提交数据,编码方式指定的话,request.getCharacterEncoding()是能得到值的,而且request对象也用此编码方式解码,不用request.setCharacterEncoding("")指定;如果request.getCharacterEncoding()是null,就要request.setCharacterEncoding("")指定编码方式,要和你提交时设定的编码方式一致.然后request.getParameter("")的值就是你想要的了.(这里有可能有误的地方请指出)