乱码的简单认识和解决
1 用什么编码保存文件 就用什么编码打开文件 比如 .txt 用utf-8 保存 就用 utf-8 打开 文件头上记录着编码方式
2 java 程序主方法 的文件是什么编码 ,程序运行 默认就是什么编码 比如 mian方法所在用 ut-f 保存 程序启动 默认编码就是utf-8 用System.out.println(System.getProperty("file.encoding")); 测试
3 乱码来源一般来源于程序之外 比如 数据库 浏览器 外部文件(IO)等,乱码的原因 编码不一致
1 package com.test; 2 import java.io.UnsupportedEncodingException; 3 import java.net.URLDecoder; 4 import java.net.URLEncoder; 5 public class test { 6 public static void main(String[] args) throws UnsupportedEncodingException { 7 8 // 程序编码方式 和 mian所在的类的文件编码方式一致 9 System.out.println("程序默认编码方式:" + System.getProperty("file.encoding")); 10 11 // page 12 String value = "孔"; 13 String value_encode = URLEncoder.encode(value, "utf-8"); // 浏览器把中文变成 14 // utf-8形式传输 15 // 可以查 16 // utf-8对应表 17 System.out.println("output:" + value_encode); // output:%E5%AD%94 18 19 // tomcat 20 String v = URLDecoder.decode(value_encode, "ISO-8859-1"); // tomcat 按 21 // ISO-8859-1 22 // 解码 就出错了 23 System.out.println("tomcat:" + v); // ??? 24 25 // web servlet 中 26 String s = URLEncoder.encode(v, "ISO-8859-1"); // 那么就反过来把结果用 ISO-8859-1 27 // 编码 28 String jieguo = URLDecoder.decode(s, "utf-8"); // 编码后得结果就变回了 29 // %E5%AD%94(UTF-8)形式 30 // ,在按 utf-8编码解码 31 // 这个过程中并没有转成二进制补码形式 32 System.out.println(jieguo); 33 34 // ------------------------------------ 35 System.out.println("------------------------------------"); 36 byte[] s1 = v.getBytes("ISO-8859-1");// [-27, -83, -108] 37 // //这个时候乱码是ISO-8859-1编码,按ISO-8859-1转成二进制补码形式 38 // 和 用"孔"按"UTF-8"转是一样得, 39 // 孔的utf-8编码形式%E5%AD%94 ,存储在计算机里二进制(补码)如--> [-27, -83, -108] 40 byte[] s2 = "孔".getBytes("UTF-8"); // [-27, -83, -108] 41 System.out.println(new String(s1, "UTF-8")); 42 System.out.println("------------------------------------"); 43 /* 44 * 字符 找到 utf-8得形式 二进制(补码) ”孔“ ->%E5%AD%94 --> [-27, -83, -108] 45 * 46 * ”孔“ -> "utf-8" -> %E5%AD%94 -解码-> "ISO-8859-1" --> 乱码 --> 47 * 按ISO-8859-1编码方式 拿到ISO-8859-1编码的二进制(补码)-->和”孔“ -> 48 * "utf-8"编码的二进制(补码)是一样的 拿到ISO-8859-1编码的二进制(补码) 后按"utf-8"编码转成中文字符 49 */ 50 // ======================================================= 51 52 String abc = "abc中国"; 53 byte[] bytes = abc.getBytes(); 54 for (byte b : bytes) { 55 System.out.print(b + " "); 56 } 57 System.out.println(); 58 String newabc = new String(abc); 59 System.out.println(newabc); 60 // Java文件编码为UTF-8: 61 // 打印结果: 62 // 97 98 99 -28 -72 -83 -27 -101 -67 63 // abc中国 64 65 // Java文件编码为GBK: 66 // 打印结果: 67 // / 97 98 99 -42 -48 -71 -6 68 // abc中国 69 // 注:java文件的编码可以通过选择java文件右键Properties——》Text file encoding 中进行设置 70 } 71 }