通过http.client解析url返回的数据时为什么中文变成了unicode码
今天在解析json数据的时候得到了一堆这样的数据:{"errNum":0,"errMsg":"success","retData":[{"title":"\u6536\u5e9f\u54c1\u5927\u53d4\u521a\u4e0a\u53f0\uff0c\u5c31\u60e8\u906d\u8bc4\u59d4\u706d\u706f\uff0c\u4f46\u63a5\u4e0b\u6765\u5168\u573a\u90fd\u9707\u60ca\u4e86\uff01","url":"http:\/\/toutiao.com\/group\/6263036756505920002\/","abstract":"\u8ba2\u9605\u6211\u83b7\u53d6\u66f4\u591a\u7cbe\u5f69\u5185\u5bb9\uff01","image_url":"http:\/\/p1.pstatp.com\/list\/2f90009a31a7ee8bb15"}]}
这是因为,为了更好的传输中文,json进行了Unicode编码。
这样一来,我们在解析json之前,就得要先将json数据中的Unicode编码转换为我们使用的中文;
一:http请求数据返回json中string字段包含unicode的转码
- public static String decodeUnicode(String theString) {
- char aChar;
- int len = theString.length();
- StringBuffer outBuffer = new StringBuffer(len);
- for (int x = 0; x < len;) {
- aChar = theString.charAt(x++);
- if (aChar == '\\') {
- aChar = theString.charAt(x++);
- if (aChar == 'u') {
- // Read the xxxx
- int value = 0;
- for (int i = 0; i < 4; i++) {
- aChar = theString.charAt(x++);
- switch (aChar) {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- value = (value << 4) + aChar - '0';
- break;
- case 'a':
- case 'b':
- case 'c':
- case 'd':
- case 'e':
- case 'f':
- value = (value << 4) + 10 + aChar - 'a';
- break;
- case 'A':
- case 'B':
- case 'C':
- case 'D':
- case 'E':
- case 'F':
- value = (value << 4) + 10 + aChar - 'A';
- break;
- default:
- throw new IllegalArgumentException(
- "Malformed \\uxxxx encoding.");
- }
- }
- outBuffer.append((char) value);
- } else {
- if (aChar == 't')
- aChar = '\t';
- else if (aChar == 'r')
- aChar = '\r';
- else if (aChar == 'n')
- aChar = '\n';
- else if (aChar == 'f')
- aChar = '\f';
- outBuffer.append(aChar);
- }
- } else
- outBuffer.append(aChar);
- }
- return outBuffer.toString();
- }
二、普通string含有unicode转码方法
- public static String reEncoding(String text, String newEncoding) {
- String str = null;
- try {
- str = new String(text.getBytes(), newEncoding);
- } catch (UnsupportedEncodingException e) {
- log.error("不支持的字符编码" + newEncoding);
- throw new RuntimeException(e);
- }
- return str;
- }
三、说一下比较奇怪的方案,测试中无意发现的,暂时没弄明白原理(有明白原理的大神,请告知一声,谢谢)
我用HttpClent的post方式获取的json数据,得到的是带Unicode码的数据,需要转换成中文才行,但是转换的时间感觉有点长,就用HttpURLConnection的get方式又试了一下,在不转码的情况下,经过gson解析后,竟然神奇的自动转换成了中文:
简直是太神奇了,而且需要的时间相对于HttpClient的post请求方式的请求和处理时间更短,所以,果断换用HttpURLConnection的get方式了
①现在先贴一下HttpURLConnection的get的方式:
- @Test
- public void test() {
- try {
- long start = System.currentTimeMillis();
- URL url = new URL("http://apis.baidu.com/songshuxiansheng/news/news");
- HttpURLConnection connection = (HttpURLConnection) url.openConnection();
- connection.addRequestProperty("apikey","0fc807e45a37ce264f45d169646f4a9e" );
- String dataString = new String(GsonTools.IsToByte(connection.getInputStream()),"utf-8");
- HeadlineJson newsJson = GsonTools.getObjectData(dataString, HeadlineJson.class);
- List<Headline>list = newsJson.getRetData();
- System.out.println(list.toString());
- long end = System.currentTimeMillis();
- System.out.println("timeGap:"+(end-start));
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
调用的GsonTools的方法:(之前的博文中有写到过)
- public static <T> T getObjectData(String jsonString, Class<T> type) {
- T t = null;
- try {
- Gson gson = new Gson();
- t = gson.fromJson(jsonString, type);
- } catch (JsonSyntaxException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return t;
- }
②然后贴一下HttpClient的post方式:
- @Test
- public void TestHeadLine() {
- long start = System.currentTimeMillis();
- List<NameValuePair> params = new ArrayList<NameValuePair>();
- String url = "http://apis.baidu.com/songshuxiansheng/news/news";
- String jsonString = HttpUtils.getBaiDuString2(url, params);
- HeadlineJson lineJson = GsonTools.getObjectData(jsonString, HeadlineJson.class);
- System.out.println(lineJson.toString());
- long end = System.currentTimeMillis();
- System.out.println("timeGap:"+(end-start));
- }
调用的HttpUtils的方法:
- public static String getBaiDuString(String url,List<NameValuePair> params) {
- String serverDataString = null;
- HttpPost post = new HttpPost(url);
- try {
- post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
- post.addHeader("apikey", UrlUtils.BAIDU_API_KEY);
- HttpClient client = new DefaultHttpClient();
- HttpResponse response = client.execute(post);
- int code = response.getStatusLine().getStatusCode();
- System.out.println("StatusCode:" + code);
- if (code == 200) {
- serverDataString = decodeUnicode(EntityUtils.toString(response.getEntity()));
- // serverDataString = EntityUtils.toString(response.getEntity());
- System.out.println("接收字符串数据成功\nServerData:"+serverDataString);
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return serverDataString;
- }
③调用的HttpClient的get方式
- public static String getBaiDuString2(String url,List<NameValuePair> params) {
- String serverDataString = null;
- HttpGet get = new HttpGet(url);
- try {get.addHeader("apikey", UrlUtils.BAIDU_API_KEY);
- HttpClient client = new DefaultHttpClient();
- HttpResponse response = client.execute(get);
- int code = response.getStatusLine().getStatusCode();
- System.out.println("StatusCode:" + code);
- if (code == 200) {
- // serverDataString = decodeUnicode(EntityUtils.toString(response.getEntity()));
- serverDataString = EntityUtils.toString(response.getEntity());
- System.out.println("接收字符串数据成功\nServerData:"+serverDataString);
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return serverDataString;
- }
谷歌提供的HttpClient的通信和HttpURLConnection网络通信的时间间隔我也做了比较,明显,HttpURLConnection的请求时间更短,所以果断使用HttpURLConnection的方式
四、java中本身就提供了对Unicode 的url进行解码的方法了:
- System.out.println(URLDecoder.decode("\u82f9\u679c", "utf-8")); 详细介绍请查看全文:https://cnblogs.com/qianzf/
通过http.client解析url返回的数据时为什么中文变成了unicode码的更多相关文章
- 【原创】@ResponseBody返回json数据时出现中文乱码
ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 原因: Spring中解析字符串的转换器默认编码格式是ISO-8859-1 public class StringHttpMessageCon ...
- Mock拦截请求URL返回模板数据
背景 : 前后端开发依赖后端数据, 当前端页面开发完成 ,后端在没有提供前端数据的情况下 ,前端无法测试, 导致开发效率低 ,速度慢 ,为了解决这一问题 ,通过Mock模拟生成数据在不改变原有代码前提 ...
- 如何解析Json返回的数据
Json在Web开发的用处非常广泛,作为数据传递的载体,如何解析Json返回的数据是非常常用的.下面介绍下四种解析Json的方式: Part 1 var list1 = [1,3,4]; alert( ...
- SpringMVC返回JSON数据时日期格式化问题
https://dannywei.iteye.com/blog/2022929 SpringMVC返回JSON数据时日期格式化问题 博客分类: Spring 在运用SpringMVC框架开发时,可 ...
- (转)MySQL 插入数据时,中文乱码问题的解决
MySQL 插入数据时,中文乱码问题的解决 原文:http://www.cnblogs.com/sunzn/archive/2013/03/14/2960248.html 当向 MySQL 数据库插 ...
- java 解析http返回xml数据
//post 请求 private static String sendPost(String url, String urlParameters) throws Exception { URL ob ...
- jquery easyui 解析数据库返回的数据
- springMVC返回json数据时date类型数据被转成long类型
在项目的过程中肯定会遇到ajax请求,但是再用的过程中会发现,在数据库中好好的时间类型数据:2017-05-04 17:52:24 在转json的时候,得到的就不是时间格式了 而是145245121这 ...
- SpringMVC 配置.html拦截时,返回JSON数据时出现406错误解决方案
[说明]在SpringMVC框架的使用中常常会使用@ResponseBody注解,修饰"处理器"(Controller的方法),这样在处理器在返回完毕后,就不走逻辑视图,而是将返回 ...
随机推荐
- CentOS 下lvm 磁盘扩容
打算给系统装一个oracle,发现磁盘空间不足.在安装系统的时候我选择的是自动分区,系统就会自动以LVM的方式分区.为了保证系统后期的可用性,建议所有新系统安装都采用LVM,之后生产上的设备我也打算这 ...
- MenOS
2018-2019-120189224 <庖丁解牛Iinux内核分析>第三周学习总结 MenuOS的构造 下载内核源代码编译内核 cd ~/LinuxKernel/ wget https: ...
- 牛客网Wannafly挑战赛15 B车辆安排(模拟)AND C 出队(规律)
传送门 :B题:点我 C题: 点我 题目描述 有n个队伍,每个队伍的人数小于等于5,每辆车最多坐5个人,要求一个队伍的人都在一辆车上,求最少的车数 输入描述: 第一行n第二行n个数,表示每个队伍的人数 ...
- openal支持的通道数和声道数
alext.h: #define AL_FORMAT_QUAD8 0x1204 101 #define AL_FORMAT_QUAD16 0x1205 102 #define AL_FORMAT_Q ...
- iOS-引用计数与ARC(转)
以下是关于内存管理的学习笔记:引用计数与ARC. iOS5以前自动引用计数(ARC)是在MacOS X 10.7与iOS 5中引入一项新技术,用于代替之前的手工引用计数MRC(Manual Refer ...
- 8.17 纯css画一个着重号图标
今天看到一个同事写的着重号图标,我以为是图片,仔细一看,是span标签!哇!!学习一下哈哈 图标长这样: CSS代码: .hint{ display: inline-block; width: 20p ...
- swift 数组 的一些快速方法
1. filter (过滤器):返回符合条件的一个数组 let arr = [1,5,6,7,10,0] //写法1 let arr1 = arr.filter { (item) -> Bool ...
- POPUP_TO_CONFIRM的使用方法
CALL FUNCTION 'POPUP_TO_CONFIRM' EXPORTING TEXT_QUESTION = '是否要打印凭证!' ...
- C#按制定的环境编译替换不出对应的配置项的解决措施。
1. 比如选择的 编译或者发布 环境是 QA ,但是QA里面配置的 替换节点 实际并没有被替换 解决方案: 在项目文件.csproj中最底部加入一下代码,应该成功.成功将QA的配置节点 替换掉默认的 ...
- git常用命令二
http://www.jianshu.com/p/08c3f1804b36http://backlogtool.com/git-guide/cn/stepup/stepup1_1.html git ...