记录一次关于java访问http接口返回值中文奇数乱码,偶数正常的问题
首先你要清楚 GBK 直接转 UTF-8 会出现问题,因为 GBK 中一个汉字是 2 个字节,UTF-8 中一个汉字是 3 个字节。所以这里你要解决的问题就是要把 GBK 中的 2 个字节在转换成 UTF-8 的时候对应成 3 个字节这样就好了。
public class Test1 {
public static void main(String[] args) throws UnsupportedEncodingException {
String gbk = "蜡笔小新新";
String utf8 = new String(gbk.getBytes("UTF-8"));
for (byte b : gbk.getBytes("UTF-8")) {
System.out.print(b + " ");
}
System.out.println();
for (byte b : utf8.getBytes()) {
System.out.print(b + " ");
}
}
}
/* 这里是控制台输出
转成UTF-8
-24 -100 -95 -25 -84 -108 -27 -80 -113 -26 -106 -80 -26 -106 -80
原来的GBK
-24 -100 -95 -25 -84 -108 -27 -80 -113 -26 -106 -80 -26 -106 63
*/
public class Test1 {
public static void main(String[] args) throws UnsupportedEncodingException {
String gbk = "蜡笔小新";
String utf8 = new String(gbk.getBytes("UTF-8"));
for (byte b : gbk.getBytes("UTF-8")) {
System.out.print(b + " ");
}
System.out.println();
for (byte b : utf8.getBytes()) {
System.out.print(b + " ");
}
}
}
/* 控制台输出
转成UTF-8
-24 -100 -95 -25 -84 -108 -27 -80 -113 -26 -106 -80
原来的GBK
-24 -100 -95 -25 -84 -108 -27 -80 -113 -26 -106 -80
*/
上面的示例大家应该知道了吧,字节的问题会导致 GBK 转换 UTF-8 的时候出现奇数中文乱码,偶数正常的问题。这里就是原因,大家可以自己手动实验一下,下面可以正确的解决这个问题。
String str = "蜡笔小新新";
String iso = new String(str.getBytes("UTF-8"),"ISO-8859-1");
for (byte o : iso.getBytes("ISO-8859-1")) {
System.out.print(o + " ");
}
System.out.println();
//模拟UTF-8编码的网站显示
System.out.println(new String(iso.getBytes("ISO-8859-1"),"UTF-8"));
/*
-24 -100 -95 -25 -84 -108 -27 -80 -113 -26 -106 -80 -26 -106 -80
蜡笔小新新
*/
**
如果发现这个还是解决不了问题的话,可以看下面
**
InputStream in = urlConnection.getInputStream();
//这里是重点
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
首先你去找到你的 HTTP 工具类 在输入流的地方加入这行代码,就没有问题了。
,"UTF-8"
InputStream in = urlConnection.getInputStream();
//这里是重点
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in,"UTF-8"));