案例分析:
2、输出流写入内容或者输入流读取内容时乱码(内容中有中文)
原因分析:
a、 如果是按字节写入或读取时乱码,应该先检测系统编码是什么样的,看看是否支持中文编码的字符集。
System.out.println(System.getProperty("file.encoding"));
a1、如果是不支持中文的就要设置jvm编码了,设置方法:
Windows环境就在catalina.bat配置:
set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8
Linux环境就在catalina.sh配置:
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=utf-8"
设置好之后,应该就没什么大问题了。(注意:读取内容要转成字符串的形式,要指定字符集,如下图:
a2、如果是支持中文编码的字符集,还出现乱码的话,首先要考虑a1中的注意事项,其次改换字符集为UTF-8,全面支持中文,
不会有漏洞。
b、如果是按字符写入或读取时乱码,那么写入和读取应指定同一字符集编码(推荐是UTF-8)。example:
//通过字符流来写入字符
String charset = "UTF-8";
FileOutputStream fout= new FileOutputStream("F:/test.txt");
OutputStreamWriter writer= new OutputStreamWriter(fout, charset);//指定字符集编码
writer.write("这就是本该拼搏的年纪,却想得太多,做得太少! ");//读取字节转换成字符
FileInputStream fis = new FileInputStream("F:/test.txt");
InputStreamReader reader= new InputStreamReader(fis, charset);//指定字符集编码
StringBuffer content = newStringBuffer();char[] buf = new char[64];int len = -1;while ((len = reader.read(buf)) != -1) {
content.append(buf,0, len);
}
System.out.println(content.toString());
如果没有指定就会获取系统编码,就有可能乱码,解决方法可以参照a。
3、数据库乱码
从上面可知,乱码问题并不难解决,搞清楚源头就好。其中要注意两个点,再次提醒:
1、最好指定好系统默认编码,否则没有设置编码的时候会获取当前系统的编码。(当你在windows中不会乱码,但是移植到linux中就可能会出现乱码)
2、设置好tomcat中uriencoding属性,配置全局编码过滤器会解决大部分请求数据乱码的问题。