Java使用百度API 返回JSON数据为unicode编码,怎么转化为中文?
2017-09-14 00:00
1271 查看
摘要: 如:{"retCode":0,"retMsg":"OK","result":{"blackLevel":"A","blackReason":"C06BM020","blackDetails":"{\"C06BM020\":[{\"province\":\"\u4e92\u5357\",\"duty\":\"(2016)\u43910821\u6c11\u521d22\u53f7\",\"court\":\"\u5b21\u6d31\u54c8\u533c\u65cf\u5f3d\u65cf\u81ea\u3cbb\u53bf\u4eba\u6c11\u6cd5\u9622\"}]}"}}
在用java调用百度API的时候返回JSON时unicode编码
1,getBytes(utf-8) (没有作用,如果是单纯的unicode编码是有效的,但是如果有其他的英文数字之类就不行)
2,
3,
也没有用
有效的
第一:
public static String convert(String utfString){
StringBuilder sb = new StringBuilder();
int i = -1;
int pos = 0;
int iint=0;
while((i=utfString.indexOf("\\u", pos)) != -1){
String sd = utfString.substring(pos, i);
sb.append(sd);
iint = i+5;
if(iint < utfString.length()){
pos = i+6;
sb.append((char)Integer.parseInt(utfString.substring(i+2, i+6), 16));
}
}
return sb+"";
}
第二种:
// tb\u674ea\u661fb
public static String readUnicodeStr2(String unicodeStr) {
StringBuilder buf = new StringBuilder();
for (int i = 0; i < unicodeStr.length(); i++) {
char char1 = unicodeStr.charAt(i);
if (char1 == '\\' && isUnicode(unicodeStr, i)) {
String cStr = unicodeStr.substring(i + 2, i + 6);
int cInt = Integer.parseInt(cStr,16);
buf.append((char) cInt);
// 跨过当前unicode码,因为还有i++,所以这里i加5,而不是6
i = i + 5;
} else {
buf.append(char1);
}
}
return buf.toString();
}
// 判断以index从i开始的串,是不是unicode码
private static boolean isUnicode(String unicodeStr, int i) {
int len = unicodeStr.length();
int remain = len - i;
// unicode码,反斜杠后还有5个字符 uxxxx
if (remain < 5)
return false;
char flag2 = unicodeStr.charAt(i + 1);
if (flag2 != 'u')
return false;
String nextFour = unicodeStr.substring(i + 2, i + 6);
return isHexStr(nextFour);
}
/** hex str 1-9 a-f A-F */
private static boolean isHexStr(String str) {
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
boolean isHex = (ch >= '1' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F');
if (!isHex)
return false;
}
return true;
}
后来测试第一,第二种都有缺陷
比如第一种,她忘记最后一部分字段
如
{"retCode":0,"retMsg":"OK","result":{"blackLevel":"A","blackReason":"C06BT020","blackDetails":"{\"C06BT020\":[{\"province\":\"云南\",\"duty\":\"(2016)云0821民初22号\",\"court\":\"宁洱哈族彝族自治县人民法院\",\"disruptTypeName\":\"其他有履行能力而拒生效法律文书确定义务的\"}]}"}}没有红色部分
第二种 有部分字段解析不出来如
{"retCode":0,"retMsg":"OK","result":{"blackLevel":"A","blackReason":"C06BT020","blackDetails":"{\"C06BT020\":[{\"province\":\"云南\",\"duty\":\"(2016)云0821民初22号\",\"court\":\"宁洱哈尼族彝族自治县人民法院\",\"disruptTypeName\":\"其他\u6709履行\u80fd力\u800c拒\u4e0d履行生效法律文书确定义务的\""}]}"}}
所以修改第一种使之获取最后一部分(确定可以)
public static String convert(String utfString){
StringBuilder sb = new StringBuilder();
int i = -1;
int pos = 0;
int iint=0;
while((i=utfString.indexOf("\\u", pos)) != -1){
String sd = utfString.substring(pos, i);
sb.append(sd);
iint = i+5;
if(iint < utfString.length()){
pos = i+6;
sb.append((char)Integer.parseInt(utfString.substring(i+2, i+6), 16));
}
}
String endStr = utfString.substring(iint+1, utfString.length());
return sb+""+endStr;
}
在用java调用百度API的时候返回JSON时unicode编码
1,getBytes(utf-8) (没有作用,如果是单纯的unicode编码是有效的,但是如果有其他的英文数字之类就不行)
String str = "\u8eab\u4efd\u8bc1\u53f7\u7801\u4e0d\u5408\u6cd5!"; byte[] bt = str.getBytes("utf-8"); String ret = new String(bt, "utf-8"); System.out.println(ret);
2,
URLDecoder.decode()也不行
3,
public void testparse(){ String jsonResult="{\"errNum\":-1,\"retMsg\":\"\u8eab\u4efd\u8bc1\u53f7\u7801\u4e0d\u5408\u6cd5!\",\"retData\":[]}"; JSONObject jsonObject=JSONObject.parseObject(jsonResult); System.out.println(jsonObject.toJSONString()); }
也没有用
有效的
第一:
public static String convert(String utfString){
StringBuilder sb = new StringBuilder();
int i = -1;
int pos = 0;
int iint=0;
while((i=utfString.indexOf("\\u", pos)) != -1){
String sd = utfString.substring(pos, i);
sb.append(sd);
iint = i+5;
if(iint < utfString.length()){
pos = i+6;
sb.append((char)Integer.parseInt(utfString.substring(i+2, i+6), 16));
}
}
return sb+"";
}
第二种:
// tb\u674ea\u661fb
public static String readUnicodeStr2(String unicodeStr) {
StringBuilder buf = new StringBuilder();
for (int i = 0; i < unicodeStr.length(); i++) {
char char1 = unicodeStr.charAt(i);
if (char1 == '\\' && isUnicode(unicodeStr, i)) {
String cStr = unicodeStr.substring(i + 2, i + 6);
int cInt = Integer.parseInt(cStr,16);
buf.append((char) cInt);
// 跨过当前unicode码,因为还有i++,所以这里i加5,而不是6
i = i + 5;
} else {
buf.append(char1);
}
}
return buf.toString();
}
// 判断以index从i开始的串,是不是unicode码
private static boolean isUnicode(String unicodeStr, int i) {
int len = unicodeStr.length();
int remain = len - i;
// unicode码,反斜杠后还有5个字符 uxxxx
if (remain < 5)
return false;
char flag2 = unicodeStr.charAt(i + 1);
if (flag2 != 'u')
return false;
String nextFour = unicodeStr.substring(i + 2, i + 6);
return isHexStr(nextFour);
}
/** hex str 1-9 a-f A-F */
private static boolean isHexStr(String str) {
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
boolean isHex = (ch >= '1' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F');
if (!isHex)
return false;
}
return true;
}
后来测试第一,第二种都有缺陷
比如第一种,她忘记最后一部分字段
如
{"retCode":0,"retMsg":"OK","result":{"blackLevel":"A","blackReason":"C06BT020","blackDetails":"{\"C06BT020\":[{\"province\":\"云南\",\"duty\":\"(2016)云0821民初22号\",\"court\":\"宁洱哈族彝族自治县人民法院\",\"disruptTypeName\":\"其他有履行能力而拒生效法律文书确定义务的\"}]}"}}没有红色部分
第二种 有部分字段解析不出来如
{"retCode":0,"retMsg":"OK","result":{"blackLevel":"A","blackReason":"C06BT020","blackDetails":"{\"C06BT020\":[{\"province\":\"云南\",\"duty\":\"(2016)云0821民初22号\",\"court\":\"宁洱哈尼族彝族自治县人民法院\",\"disruptTypeName\":\"其他\u6709履行\u80fd力\u800c拒\u4e0d履行生效法律文书确定义务的\""}]}"}}
所以修改第一种使之获取最后一部分(确定可以)
public static String convert(String utfString){
StringBuilder sb = new StringBuilder();
int i = -1;
int pos = 0;
int iint=0;
while((i=utfString.indexOf("\\u", pos)) != -1){
String sd = utfString.substring(pos, i);
sb.append(sd);
iint = i+5;
if(iint < utfString.length()){
pos = i+6;
sb.append((char)Integer.parseInt(utfString.substring(i+2, i+6), 16));
}
}
String endStr = utfString.substring(iint+1, utfString.length());
return sb+""+endStr;
}
相关文章推荐
- http 请求数据返回 json 中中文字符为 unicode 编码转汉字转码
- 如何使得中文不被 json_encode 不编码成 unicode PHP 浏览:9722 2014年08月14日 使用 php 自带的 json_encode 函数对数据进行编码时,中文都会变成
- Java调用天气接口(百度天气)解析返回的JSON数据
- 回复:String中如果有中文,如何保证length()返回的长度 在 Java 中字符串是以 Unicode 方式编码的,所以,无论中英文都算的长度为 1。根据你的描述,估计是想要取得英文长度为 1 中文长度为 2 的总长度吧。这个,理论上可以构造 An
- Java抓取网页上的unicode 数据 "\u5751\u7239\u7889\u5821" 怎么变成中文
- 百度天气api开发 全解析xml和json格式 使用json-lib jsonObject、 Gson 方式把json 转换成 java对象
- Java调用天气接口(百度天气)解析返回的JSON数据
- spring boot 使用fastjson 处理json数据中文乱码 默认使用 ISO-8859-1编码格式
- 使用Java将中文字符转换成Unicode编码
- Java后台使用get方式远程跨域请求,返回数据为中文乱码解决方法
- 安卓使用Gson解析服务器返回Json数组,以及java服务器怎样返回list集合的Json数据(原创)
- spring boot新手教程之使用FastJson解析JSON数据以及解决返回中文乱码问题
- Ajax使用Action中返回的Json数据的完整实例(二):action内将一个实体对象转化为json并返回
- java 处理get请求得到json数据的中文编码
- Spring mvc 使用Gson 返回Json数据 中文乱码问题
- php 返回不对中文unicode编码的json
- Apache HttpComponents 的使用入门(java使用HttpClient访问Api, 使用json.org库处理json数据)
- 百度API返回JSON数据解析
- Java调用天气接口(百度天气)解析返回的JSON数据
- PHP返回JSON数据及中文编码问题的解决方案