web工程中,乱码产生原因:java内核以及class文件是基于Unicode的,带来了良好的跨平台型,同时也带来了中文乱码的麻烦。主要原因包括两方面:
1.java和jsp本身编译时产生的乱码:源文件中可能存在中文,而源文件的保存方式是基于字节流的,如果在其编译成class文件的过程中使用的编码方式与源文件不一直就会产生乱码。
2.java和其他存储媒介交互式产生乱码:数据库、文件、流等存储方式也是基于字节流的,java程序在于这些存储方式进行交互时就会产生字符与字节之间的转换,转换过程中使用的编码方式与原编码方式不一致就会产生乱码问题。
解决方案:
1.关于jsp与页面参数之间的乱码解决:
(1)页面参数的编码类型与系统默认的编码类型不一致造成的乱码:强制指定request获取参数的编码方式,如下
request.setCharacterEncoding("GBk");
(2)jsp在页面显示是出现乱码:在页面中设置编码格式,代码如下:
response.setContentType("text/html;charset=GBK");
(3)比解决方案(2)更简单的方法是使用filter进行过滤,web.xml中的配置省略,filter包下的CodeFilter类的主要代码如下:
public class CodeFilter implements Filter
{
public void destroy(){} //销毁方法
public void doFilter(ServletRequest req,ServletRequestResponse resp,FilterChain chain) throws IOException,ServletException
{
HttpServletRequest request = (HttpServletRequest)req; //强制类型转换
HttpServletResponse response = (HttpServletResponse)resp; //强制类型转换
request.setCharacterEncoding("gbk"); //设置request对象的编码格式为gbk
response.setCharacterEncoding("gbk"); //设置response对象的编码格式为gbk
chain.doFilter(request,response);
}
public void init(FilterConfig conf) throws ServletException {} //初始方法
}
(3)jsp与数据库之间的乱码解决方案:可以在驱动的URL参数中直接进行指定:
jdbc:mysql://localhost/your_DB_name?user=root&password=root&useUnicode&characterEncoding=GBK
(4)java与文件、流之间乱码的解决方案:java往往通过FileReader和FileWirter这两个类完成字符类型的读写,但这两个类的默认构造函数会使用系统的编码方式,如果文件的内容与系统的编码方式不一样,便会出现乱码。建议使用其父类,即InputStreamReader(InputStream in,Character cs)和OutputStreamWriter(OutputStream out,Character cs)
以上便是自己学习时总结的一些java乱码解决方案,参考了《java web 开发学习实录》(清华大学出版社)一书及相关博客中的内容,仅供学习与交流。