JAVA很容易出现乱码...具体分析以下几个环节的编码。
1.编译
JAVA源文件可能是GBK编码也可能是UTF8编码,使用javac命令编译的时候,会使用操作系统默认的编码编译文件。
如果平台是windows,而源文件是UTF8编码,则遇到了第一个乱码问题。
这时候可以使用javac命令的encoding选项,标明源文件的编码格式。
经过编译之后,JAVA字节码文件以UTF8编码存储在class文件中。
-encoding <编码> 指定源文件使用的字符编码
2.运行
JAVA在运行时,采用unicode编码,JAVA系统内部不存在乱码问题。
但是输入输出还是依赖外部编码。默认使用操作系统的默认编码。
也可以指定file.encoding参数。
如果设置了file.encoding参数,System.in、System.out、string.getBytes()等都会使用这个设置的编码解析数据,否则使用平台的默认编码。
-
public class Test {
-
public static void main(String[] args) {
-
String data="中文";
-
System.out.println(Charset.defaultCharset());
-
System.out.println(data);
-
}
-
}
平台是windows系统,默认编码为GBK,可以看到不同的file.encoding参数导致运行结果的不一样。

3.JDBC编码
因为JAVA系统运行时采用unicode编码,如果数据库采用GBK或者utf8编码,则可能出现乱码问题。
Oracle数据库采用唯一编码,oracle的jdbc会自动将unicode转换为目标Oracle数据库的编码。
而Mysql可以同时使用多种编码,所以需要在Mysql JDBC的url中指定目标数据库的编码。
4.URL编码
如果需要在URL中传输中文参数,除了JS两次编码的方式,也可以使用如下方式。
-
public class Test {
-
public static void main(String[] args) throws UnsupportedEncodingException {
-
// 模拟浏览器将中文参数编码
-
String data = "%E4%B8%AD%E6%96%87%E8%AF%B7%E6%B1%82";
-
-
// 模拟Tomcat使用默认URIEncoding解码[ISO-8859-1]
-
data = URLDecoder.decode(data, "ISO-8859-1");
-
System.out.println(data);
-
-
//模拟在doGet中获取参数
-
data=new String(data.getBytes("ISO-8859-1"),"utf8");
-
System.out.println(data);
-
}
-
}
运行结果如下:
??????è?·?±?
中文请求
两次JS编码方式参见:http://blog.itpub.net/29254281/viewspace-775925/
详细资料:http://blog.csdn.net/feihong247/article/details/7841237
5.关于指定编码
无论是Spring的CharacterEncodingFilter还是request的setCharacterEncoding,都是为byte[]指定解码的规则,而不是转换。
-
public class Test {
-
public static void main(String[] args) throws UnsupportedEncodingException {
-
byte[] data = "中".getBytes("utf8");
-
System.out.println(new String(data, "utf8"));
-
System.out.println(new String(data, "gbk"));
-
//运行结果:
-
//中
-
//涓?
-
}
-
}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-1063133/
,如需转载,请注明出处,否则将追究法律责任。