go json数据出现unicode_【Android】OkHttp、Retrofit拿到的json是Unicode,我要的是UTF-8呀...
不管是用HttpClient还是用OkHttp,都可以用来请求网络,然后拿到后台返回的json数据,然后按需要一步步解析。
当然,我们有时候需要先确认返回的json数据中某个字段有没有数据,我们拿到json字符串,然后用工具把它格式化,就可以人性化地看json数据。
json数据中的数字和字母一般都不会因为编码发生变化,但是汉字就比较特殊,会在GBK、UTF-8中有不同的表现形式。
之前我用的是AsyncHttp(一个古老的用HttpClient封装的网络请求框架),返回的数据是一个回调接口,接口中有个参数:JSONObject response,然后就可以一层层拿到response中需要的数据。
也可以把response的全部数据以字符串形式拿出来,放在json格式化工具中展示。
后来我在使用Retrofit时,拿到的回调数据是:Response response,然后使用response.body().string()拿到后台返回的json数据,可是当我拿到格式化工具中查看时,我傻眼了,里边没有一个汉字,全部是Unicode编码,不是乱码,不是乱码,不是乱码。
我在想是不是Retrofit处理了我的返回数据,又用Okhttp试了下,还是那样,难道后台返回的数据是Unicode,经确认,后台返回的数据是UTF-8格式的,这就奇怪了,为什么AsyncHttp拿到的是UTF-8的,难道Okhttp对数据做了手脚?
简单地看了下,没找到OkHttp有修改编码的地方,那就只能想办法修改数据编码格式了。
方法一:
在网上搜了下,有方法可以将UTF-8 转换成 Unicode,http://blog.csdn.net/xyw_blog/article/details/8510740,不过看起来好长。
utf-8转unicode
/*** utf-8 转换成 unicode* @author fanhui* 2007-3-15* @param inStr* @return*/public static String utf8ToUnicode(String inStr) {char[] myBuffer = inStr.toCharArray();StringBuffer sb = new StringBuffer();for (int i = 0; i < inStr.length(); i++) {UnicodeBlock ub = UnicodeBlock.of(myBuffer[i]);if(ub == UnicodeBlock.BASIC_LATIN){//英文及数字等sb.append(myBuffer[i]);}else if(ub == UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS){//全角半角字符int j = (int) myBuffer[i] - 65248;sb.append((char)j);}else{//汉字short s = (short) myBuffer[i];String hexS = Integer.toHexString(s);String unicode = "u"+hexS;sb.append(unicode.toLowerCase());}}return sb.toString();}/*** unicode 转换成 utf-8* @author fanhui* 2007-3-15* @param theString* @return*/public static String unicodeToUtf8(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 xxxxint 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);}} elseoutBuffer.append(aChar);}return outBuffer.toString();}
方法二:
然后又去找其他方法,之前用过Retrofit和Gson的配合,然后gradle中导入Gson和Retrofit的Gson转换包,这一次拿到response.body().string()的数据后,放进格式化工具中一看,汉字出来了。
有点小激动,看来Gson默认是UTF-8格式,成功了,但是又一想,为了这个目的,连导了两个包,这不划算呀。
方法三:
继续思考,受Gson和AsyncHttp中JsonObject的启发,我尝试创建了一个对象,
JsonObject jsonObject = new JsonObject(response.body().string());
然后调用
jsonObject.toString();
把得到的数据放入格式化工具中,汉字出现了。
总结
这样比较下来,方法三还是比较简单方便的。
go json数据出现unicode_【Android】OkHttp、Retrofit拿到的json是Unicode,我要的是UTF-8呀...相关推荐
- android网络请求撤销,Android OkHttp + Retrofit 取消请求的方法
前言 在某一个界面,用户发起了一个网络请求,因为某种原因用户在网络请求完成前离开了当前界面,比较好的做法是取消这个网络请求.对于OkHttp来说,具体是调用Call的cancel方法. 如何找到这一个 ...
- 全网最简单的C# json数据解析 无敌菜鸟教程 十分钟搞定json数据解析
全网最简单的C# json数据解析 无敌菜鸟教程 十分钟搞定json数据解析 废话先说一点,算了.直接进入正题吧. 用例子说话: JSON数据: string json: " {" ...
- Android OkHttp+Retrofit+Rxjava+Hilt 的网络请求封装
今天给大家简单的封装一个现在比较流行的网络请求框架 第一步是导入我们所需要的依赖还需要在android {}闭包下添加一个 buildFeatures{viewBinding true } imple ...
- android给后台传递json,将服务中的JSON数据发送到Android中的UI
要求是:我有一个后台服务,在该服务中,我正在执行REST调用以获取JSON数据.我想将JSON数据发送到UI并更新内容. 我可以使用的一种方法是,将整个JSON字符串存储在SharedPreferen ...
- controller接收json数据_答疑 | 前后端分离,如何接收json数据?
1.颜老师,在前后端分离的项目中,后端如何接收前端发来的json数据?我记得是@RequestBody,但有时候会报错. 答:当使用SpringMVC接收json数据时,需要区分json的数据格式,具 ...
- python为什么closed_为什么Python无法解析此JSON数据? [关闭] - Why can't Python parse this JSON data? [closed]...
问题: I have this JSON in a file: 我在文件中有此JSON: { "maps": [ { "id": "blabla&qu ...
- ios 获取html中的json数据,[IOS]UIWebView实现保存页面和读取服务器端json数据
#import"ViewController.h" @interfaceViewController() @end @implementation ViewController - ...
- python爬取json数据与实际不一样_Python如何爬取Json数据
Python如何爬取Json数据 发布时间:2020-12-08 09:52:09 来源:亿速云 阅读:58 作者:小新 这篇文章将为大家详细讲解有关Python如何爬取Json数据,小编觉得挺实用的 ...
- javaweb后台如何传json数据给前台,以及前台如何解析得到json中数据
后台controoler中传数据给前台jsp方法: 1.后台controller的方法中定义一个JsonObject对象,JsonObject jsonObject=new JsonObject(); ...
最新文章
- 什么叫计算机网络阻塞,计算机网络体系结构的阻塞控制是什么呢?
- 鸡啄米:模态、非模态对话框
- 《数字图像处理》冈萨雷斯学习笔记3:频域处理
- 心想技术驱动业务,却在背道而驰
- codeUp 2031 To fill or not to fill 复杂贪心
- Android Studio 导入 AOSP 源码 1
- 软件开发安全性_开发具有有效安全性的软件的最佳方法
- BIO,Socket网络编程入门代码示例,NIO网络编程入门代码示例,AIO 网络编程
- 没有文化可以学php吗,宋威龙深夜发文感慨,却被吐槽文化低,学历真的重要吗?...
- c++ inline 函数及变量
- 关于CSS的fixed定位
- python一个类有几个实例对象_Python用一个类实例来解开一个对象
- html中的form是空标签么,关于html 中form表单的内标签和使用
- link st 量产工具_STM32 ST-LINK Utility介绍、下载、安装、使用方法
- Python 的切片为什么不会索引越界?
- 纯css3黑洞动画js特效
- python爬虫和八爪鱼哪个快_八爪鱼采集器能取代python爬虫吗?
- linux vi波浪符号的作用,vi使用方法
- 【云原生之Docker实战】使用Docker部署Wizard文档管理系统
- 计算机缓存怎样更改,计算机的缓存大小在哪设置?