Java 乱码是因为 Java 和 JSP 源文件的保存方式是基于字节流的,如果 Java 和 JSP 编译成 class 文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码。在这里,总结一下 java 乱码的一些常见情况
1.Javascript 传参乱码:
在浏览器端对要传递的中文参数进行编码处理 . 代码如下 :
xmlhttp.open("POST",url,true); // 请求参数初始化
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); // 因为请求方式为 POST, 所以这里要设置请求头 .( 如果请求方式为 GET, 此句代码可以省略 )
xmlhttp.send("name="+encodeURI(encodeURI(" 星期日 "))); // 向服务器端发送参数
在服务器端代码 :
页面 jsp 保证是 utf-8 编码
<%@ page contentType="text/html; charset=GBK"%>
接受中文参数
PrintWriter out = response.getWriter(); // 得到 response 的输出流对象
String name1 = request.getParameter("name"); // 得到 KEY 为 "name" 的请求参数
String name = URLDecoder.decode(name1,"utf-8"); // 对得到的参数进行解码
out.print(name); // 向浏览器端发送数据
2.JSP 与页面参数之间的乱码
JSP 获取页面参数时一般采用系统默认的编码方式,如果页面参数的编码类型和系统默认的编码类型不一致,很可能就会出现乱码。解决这类乱码问题的基本方法是在页面获取参数之前,强制指定 request 获取参数的编码方式: request.setCharacterEncoding("UTF-8") 。
如果在 JSP 将变量输出到页面时出现了乱码,可以通过设置 response.setContentType("text/html;charset=UTF-8") 。
JSP 页面乱码通常只要在页面开始地方用上面代码指定字符集编码即可。如果还不行,那么请用下面这句话来转换 str=new String(str.getBytes("ISO-8859-1")," 页面编码方式 ");
3. 热链接传参乱码
在传参的 jsp 对中文进行编码: href="new.jsp?name=java.net.URLEncoder.encode(" 链接 ")";
在接受的 jsp 对中文进行转码: String str = URLDecoder.decode(request.getParameter("name "), "utf-8");
4.Java 与数据库之间的乱码
大部分数据库都支持以 unicode 编码方式,所以解决 Java 与数据库之间的乱码问题比较明智的方式是直接使用 unicode 编码与数据库交互。很多数据库驱动自动支持 unicode ,如 Microsoft 的 SQLServer 驱动。其他大部分数据库驱动,可以在驱动的 url 参数中指定,如 mysql 驱动: jdbc:mysql://localhost/MYAPPS?useUnicode=true&characterEncoding=GBK 。
5.Java 与文件 / 流之间的乱码
Java 读写文件最常用的类是 FileInputStream/FileOutputStream 和 FileReader/FileWriter 。其中 FileInputStream 和 FileOutputStream 是基于字节流的,常用于读写二进制文件。读写字符文件建议使用基于字符的 FileReader 和 FileWriter ,省去了字节与字符之间的转换。但这两个类的构造函数默认使用系统的编码方式,如果文件内容与系统编码方式不一致,可能会出现乱码。在这种情况下,建议使用 FileReader 和 FileWriter 的父类: InputStreamReader/OutputStreamWriter ,它们也是基于字符的,但在构造函数中可以指定编码类型: InputStreamReader(InputStream in, Charset cs) 和 OutputStreamWriter(OutputStream out, Charset cs) 。