分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 软件开发

通过http.client解析url返回的数据时为什么中文变成了unicode码

发布时间:2023-09-06 01:21责任编辑:郭大石关键词:urlhttp

今天在解析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的转码

[java] view plain copy
  1. publicstaticStringdecodeUnicode(StringtheString){
  2. charaChar;
  3. intlen=theString.length();
  4. StringBufferoutBuffer=newStringBuffer(len);
  5. for(intx=0;x<len;){
  6. aChar=theString.charAt(x++);
  7. if(aChar==‘\\‘){
  8. aChar=theString.charAt(x++);
  9. if(aChar==‘u‘){
  10. //Readthexxxx
  11. intvalue=0;
  12. for(inti=0;i<4;i++){
  13. aChar=theString.charAt(x++);
  14. switch(aChar){
  15. case‘0‘:
  16. case‘1‘:
  17. case‘2‘:
  18. case‘3‘:
  19. case‘4‘:
  20. case‘5‘:
  21. case‘6‘:
  22. case‘7‘:
  23. case‘8‘:
  24. case‘9‘:
  25. value=(value<<4)+aChar-‘0‘;
  26. break;
  27. case‘a‘:
  28. case‘b‘:
  29. case‘c‘:
  30. case‘d‘:
  31. case‘e‘:
  32. case‘f‘:
  33. value=(value<<4)+10+aChar-‘a‘;
  34. break;
  35. case‘A‘:
  36. case‘B‘:
  37. case‘C‘:
  38. case‘D‘:
  39. case‘E‘:
  40. case‘F‘:
  41. value=(value<<4)+10+aChar-‘A‘;
  42. break;
  43. default:
  44. thrownewIllegalArgumentException(
  45. "Malformed\\uxxxxencoding.");
  46. }
  47. }
  48. outBuffer.append((char)value);
  49. }else{
  50. if(aChar==‘t‘)
  51. aChar=‘\t‘;
  52. elseif(aChar==‘r‘)
  53. aChar=‘\r‘;
  54. elseif(aChar==‘n‘)
  55. aChar=‘\n‘;
  56. elseif(aChar==‘f‘)
  57. aChar=‘\f‘;
  58. outBuffer.append(aChar);
  59. }
  60. }else
  61. outBuffer.append(aChar);
  62. }
  63. returnoutBuffer.toString();
  64. }

二、普通string含有unicode转码方法

  • thrownewRuntimeException(e);
  • }
  • returnstr;
  • }
  • 三、说一下比较奇怪的方案,测试中无意发现的,暂时没弄明白原理(有明白原理的大神,请告知一声,谢谢)

    我用HttpClent的post方式获取的json数据,得到的是带Unicode码的数据,需要转换成中文才行,但是转换的时间感觉有点长,就用HttpURLConnection的get方式又试了一下,在不转码的情况下,经过gson解析后,竟然神奇的自动转换成了中文:



    简直是太神奇了,而且需要的时间相对于HttpClient的post请求方式的请求和处理时间更短,所以,果断换用HttpURLConnection的get方式了



    ①现在先贴一下HttpURLConnection的get的方式:

    [java] view plain copy
    1. @Test
    2. publicvoidtest(){
    3. try{
    4. longstart=System.currentTimeMillis();
    5. URLurl=newURL("http://apis.baidu.com/songshuxiansheng/news/news");
    6. HttpURLConnectionconnection=(HttpURLConnection)url.openConnection();
    7. connection.addRequestProperty("apikey","0fc807e45a37ce264f45d169646f4a9e");
    8. StringdataString=newString(GsonTools.IsToByte(connection.getInputStream()),"utf-8");
    9. HeadlineJsonnewsJson=GsonTools.getObjectData(dataString,HeadlineJson.class);
    10. List<Headline>list=newsJson.getRetData();
    11. System.out.println(list.toString());
    12. longend=System.currentTimeMillis();
    13. System.out.println("timeGap:"+(end-start));
    14. }catch(Exceptione){
    15. //TODOAuto-generatedcatchblock
    16. e.printStackTrace();
    17. }
    18. }


    调用的GsonTools的方法:(之前的博文中有写到过)

    [java] view plain copy
    1. publicstatic<T>TgetObjectData(StringjsonString,Class<T>type){
    2. Tt=null;
    3. try{
    4. Gsongson=newGson();
    5. t=gson.fromJson(jsonString,type);
    6. }catch(JsonSyntaxExceptione){
    7. //TODOAuto-generatedcatchblock
    8. e.printStackTrace();
    9. }
    10. returnt;
    11. }


    ②然后贴一下HttpClient的post方式:

    [java] view plain copy
    1. @Test
    2. publicvoidTestHeadLine(){
    3. longstart=System.currentTimeMillis();
    4. List<NameValuePair>params=newArrayList<NameValuePair>();
    5. Stringurl="http://apis.baidu.com/songshuxiansheng/news/news";
    6. StringjsonString=HttpUtils.getBaiDuString2(url,params);
    7. HeadlineJsonlineJson=GsonTools.getObjectData(jsonString,HeadlineJson.class);
    8. System.out.println(lineJson.toString());
    9. longend=System.currentTimeMillis();
    10. System.out.println("timeGap:"+(end-start));
    11. }


    调用的HttpUtils的方法:

    [java] view plain copy
    1. publicstaticStringgetBaiDuString(Stringurl,List<NameValuePair>params){
    2. StringserverDataString=null;
    3. HttpPostpost=newHttpPost(url);
    4. try{
    5. post.setEntity(newUrlEncodedFormEntity(params,HTTP.UTF_8));
    6. post.addHeader("apikey",UrlUtils.BAIDU_API_KEY);
    7. HttpClientclient=newDefaultHttpClient();
    8. HttpResponseresponse=client.execute(post);
    9. intcode=response.getStatusLine().getStatusCode();
    10. System.out.println("StatusCode:"+code);
    11. if(code==200){
    12. serverDataString=decodeUnicode(EntityUtils.toString(response.getEntity()));
    13. //serverDataString=EntityUtils.toString(response.getEntity());
    14. System.out.println("接收字符串数据成功\nServerData:"+serverDataString);
    15. }
    16. }catch(Exceptione){
    17. //TODOAuto-generatedcatchblock
    18. e.printStackTrace();
    19. }
    20. returnserverDataString;
    21. }


    ③调用的HttpClient的get方式

    [java] view plain copy
    1. publicstaticStringgetBaiDuString2(Stringurl,List<NameValuePair>params){
    2. StringserverDataString=null;
    3. HttpGetget=newHttpGet(url);
    4. try{get.addHeader("apikey",UrlUtils.BAIDU_API_KEY);
    5. HttpClientclient=newDefaultHttpClient();
    6. HttpResponseresponse=client.execute(get);
    7. intcode=response.getStatusLine().getStatusCode();
    8. System.out.println("StatusCode:"+code);
    9. if(code==200){
    10. //serverDataString=decodeUnicode(EntityUtils.toString(response.getEntity()));
    11. serverDataString=EntityUtils.toString(response.getEntity());
    12. System.out.println("接收字符串数据成功\nServerData:"+serverDataString);
    13. }
    14. }catch(Exceptione){
    15. //TODOAuto-generatedcatchblock
    16. e.printStackTrace();
    17. }
    18. returnserverDataString;
    19. }


    谷歌提供的HttpClient的通信和HttpURLConnection网络通信的时间间隔我也做了比较,明显,HttpURLConnection的请求时间更短,所以果断使用HttpURLConnection的方式

    四、java中本身就提供了对Unicode 的url进行解码的方法了:

    [java] view plain copy
      1. System.out.println(URLDecoder.decode("\u82f9\u679c","utf-8"));

    通过http.client解析url返回的数据时为什么中文变成了unicode码

    原文地址:http://www.cnblogs.com/qianzf/p/7750761.html

    知识推荐

    我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
    icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved