乱码的简单认识和解决

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 }
View Code
原文地址:https://www.cnblogs.com/kongxianghao/p/6848372.html