最近项目开发中出现二进制byte转String类型出现乱码问题:
乱码问题根源:编码与解码所用的字符编码方式不一致
示例代码如下:
/**
* @Author: chuxia0811
* @Date: 2021/7/17 10:56
* @Description :
*/
public class Byte2String {
public static void main(String[] args) {
try {
byte[] b_GBK = "中国".getBytes("GBK");
byte[] b_UTF8 = "中国".getBytes("UTF-8");
byte[] b_ISO88591 = "中国".getBytes("ISO8859-1");
//对字节数组按照指定的字符编码方式解码
System.out.println(new String(b_UTF8, "UTF-8"));
System.out.println(new String(b_UTF8, "ISO8859-1"));
System.out.println(new String(b_ISO88591, "UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果如下:
中国
ä¸å›½
??
第二行乱码因为:编码UTF-8,解码ISO8859-1,编解码所用的字符编码方式不一致
第三行乱码因为:编码ISO8859-1,解码UTF-8,同上
总结:
只要保持编解码所用的字符编码方式一致就可以避免乱码
但有时会遇到我们获取到的数据已经按错误的字符编码方式解码的情况,比如从redis中获取出来的就是错误的编码方式 ,那么如何复原呢?
解决方案:
1.按错误字符编码方式编码(复原为原始byte数组)
2.按正确字符编码方式解码
例如:
//UTF-8编码
byte[] b_utf = "中国".getBytes("UTF-8");
//ISO8859-1解码
String before = new String(b_utf, "ISO8859-1");
System.out.println("before = " + before);
//已经乱码,乱码后续处理:
//ISO8859-1编码(复原字节数据)
byte[] b_iso = before.getBytes("ISO8859-1");
//UTF-8解码(正确解码)
String after = new String(b_iso, "UTF-8");
System.out.println("after = " + after);