Java WEB开发中的中文乱码问题解决本文所有范例以UTF-8为例。
大家可以根据自己的情况加以替换。
在开始本文之前,假设本文的读者已经熟悉或了解以下技术:- Java语法- Java WEB开发的基本概念- Jsp- Servlet- 至少一种支持JSP/SERVLET的Web服务器(包括安装,运行)浏览器/WEB服务器之间的参数传递原理分析浏览器/WEB服务器之间的中文参数传递1,表单(form)中文参数的传递方法。
我们使用一个简单的范例说明表单提交时浏览器的对中文参数的处理。
1. SubmitAsia.html2. view plaincopy to clipboardprint?3. <html>4. <head>5. <meta http-equiv="content-type" content="text/html; charset=UTF-8">6. </head>7. <body>8. <form method="get">9. <input type="text" name="userName" id="userName"><input type="submit" value="submit" />10. </form>11. </body>12. </html>13. <html>14. <head>15. <meta http-equiv="content-type" content="text/html; charset=UTF-8">16. </head>17. <body>18. <form method="get">19. <input type="text" name="userName" id="userName"><input type="submit" value="submit" />20. </form>21. </body>22. </html>使用任意浏览器打开该文件,在输入框内输入“你好” 中文2字,然后按submit按钮,我们注意到浏览器的地址栏:file:///C:/SubmitAsia.html?userName=%E4%BD%A0%E5%A5%BD刚才输入“你好”二字,被转换为%E4%BD%A0%E5%A5%BD 后被发往服务器。
这个%E4%BD%A0%E5%A5%BD 是什么呢?我们先使用一个Java程序来测试一下。
如下:1. EnDecoderUtil.java2. view plaincopy to clipboardprint?4. import java.io.UnsupportedEncodingException;5. import .URLDecoder;6. import .URLEncoder;7.8. public class EnDecoderUtil {9. public static void main(String []args) {10. try {11. String str = URLEncoder.encode("你好", "UTF-8");12. System.out.println(str);13. str = URLDecoder.decode(str, "UTF-8");14. System.out.println(str);15.16. } catch (UnsupportedEncodingException e) {17. e.printStackTrace();18. }19. }20. }21.22. import java.io.IOException;23. import java.io.UnsupportedEncodingException;24. import .URLDecoder;26.27. public class EnDecoderUtil {28. public static void main(String []args) {29. try {30. String str = URLEncoder.encode("你好", "UTF-8");31. System.out.println(str);32. str = URLDecoder.decode(str, "UTF-8");33. System.out.println(str);34.35. } catch (UnsupportedEncodingException e) {36. e.printStackTrace();37. }38. }39. }编译执行:c:\>javac EnDecoderUtil.javac:\>java EnDecoderUtil%E4%BD%A0%E5%A5%BD你好我们发现,浏览器发送给服务器的“你好”中文参数跟使用.URLEncoder.encode()方法编码后的值完全一样。
原来,浏览器在向服务器传递参数时,对于非数字,非英文的字符(比如中日韩文)时,会先将其加以变换(编码),再发送给服务器,服务器接收到这种格式的字符时,会将其反向编码,还原成原来的字符。
浏览器/Java WEB服务器之间的中文参数传递过程模拟为了帮助大家能更好地理解,我们使用下面的例子,该例通过联结的形式向Google服务器发送一个查询命令参数。
比如,我们通过Google查询“你好啊”,通过以下2种方法向Google服务器发送参数:1. SubmitAsia2Google.html2. view plaincopy to clipboardprint?3. <html>4. <head>5. <meta http-equiv="content-type" content="text/html; charset=UTF-8">6. </head>7. <body>8. 方法1:<a href="/search?q=你好啊">你好啊</a><br>9. 方法2:<ahref="/search?q=%E4%BD%A0%E5%A5%BD%E5%95%8A">你好啊</a>10. </body>11. </html>12. <html>13. <head>14. <meta http-equiv="content-type" content="text/html; charset=UTF-8">15. </head>16. <body>17. 方法1:<a href="/search?q=你好啊">你好啊</a><br>18. 方法2:<ahref="/search?q=%E4%BD%A0%E5%A5%BD%E5%95%8A">你好啊</a>19. </body>20. </html>使用任意浏览器打开该文件。
方法1:你好啊方法2:你好啊使用方法1时,Google的查询页面通常会显示乱码,方法2时显示完全正常。
通过这个例子,我们知道,为了让服务器能够正常接收中文参数,对HTML页面的中文参数一定要经过编码处理。
表单里的中文字符在提交时,浏览器已经替我们做了编码处理,但联结(<a href.../>)里的中文需要我们自己处理。
JSP页面联结的中文参数编码方法JSP页面里的联结很多情况下是动态生成的,比如根据数据库里的数据的不同动态生成包含中文关键字的联结等等。
方法1:JSP里直接使用.URLEncoder.encode()。
例:<ahref="some.jsp?key=<%=.URLEncoder.encode("可能包含中文的参数","UTF-8")%>">联结</a>方法2:Javabean使用.URLEncoder.encode()在Javabean里使用.URLEncoder.encode()处理之后,JSP里加以引用。
1. view plaincopy to clipboardprint?2. <jsp:useBean id="someBean" class="Beans.SomeBean"3. scope="request" />4. ...5. <%6. String chars = myBean.getSomeProp();7. out.println("<a href=\"some.jsp?key=" + chars + ">联结</a>");8. %>9. ...10. <jsp:useBean id="someBean" class="Beans.SomeBean"11. scope="request" />12. ...13. <%14. String chars = myBean.getSomeProp();15. out.println("<a href=\"some.jsp?key=" + chars + ">联结</a>");16. %>17. ...方法3:使用自定义标签。