北大青鸟

网站首页 > 常见IT技术问题 > Java开发 >

站内公告

Java WEB开发中的中文乱码问题解决

责任编辑:宏鹏来源:武汉北大青鸟鲁广校区时间:2023-01-06 15:47:37
导读:本文旨在探讨解决Java WEB开发中的中文乱码问题。

本文所有范例以UTF-8为例。大家可以根据自己的情况加以替换。

在开始本文之前,假设本文的读者已经熟悉或了解以下技术:

- Java语法

- Java WEB开发的基本概念

- Jsp

- Servlet

- 至少一种支持JSP/SERVLET的Web服务器(包括安装,运行)

浏览器/WEB服务器之间的参数传递原理分析

浏览器/WEB服务器之间的中文参数传递

1,表单(form)中文参数的传递方法。我们使用一个简单的范例说明表单提交时浏览器的对中文参数的处理。

1.SubmitAsia.html

2.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>

使用任意浏览器打开该文件,在输入框内输入 &ldquo;你好&rdquo; 中文2字,然后按submit按钮,我们注意到浏览器的地址栏:

file:///C:/SubmitAsia.html?userName=%E4%BD%A0%E5%A5%BD

刚才输入&ldquo;你好&rdquo;二字,被转换为 %E4%BD%A0%E5%A5%BD 后被发往服务器。

这个 %E4%BD%A0%E5%A5%BD 是什么呢?

我们先使用一个Java程序来测试一下。如下:

1.EnDecoderUtil.java

2.view plaincopy to clipboardprint?

3.import java.io.IOException;

4.import java.io.UnsupportedEncodingException;

5.import java.net.URLDecoder;

6.import java.net.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 java.net.URLDecoder;

25.import java.net.URLEncoder;

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.java

c:\>java EnDecoderUtil

%E4%BD%A0%E5%A5%BD

你好

我们发现,浏览器发送给服务器的&ldquo;你好&rdquo;中文参数跟使用java.net.URLEncoder.encode()方法编码后的值完一样。

原来,浏览器在向服务器传递参数时,对于非数字,非英文的字符(比如中日韩文)时,会先将其加以变换(编码),再发送给服务器,服务器接收到这种格式的字符时,会将其反向编码,还原成原来的字符。

浏览器/Java WEB服务器之间的中文参数传递 过程模拟

为了帮助大家能更好地理解,我们使用下面的例子,该例通过联结的形式向Google服务器发送一个查询命令参数。

比如,我们通过Google查询&ldquo;你好啊&rdquo;,通过以下2种方法向Google服务器发送参数:

1.SubmitAsia2Google.html

2.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="//www.google.com/search?q=你好啊">你好啊</a><br>

9.方法2:<a href="//www.google.com/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="//www.google.com/search?q=你好啊">你好啊</a><br>

18.方法2:<a href="//www.google.com/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里直接使用java.net.URLEncoder.encode()。例:<a href="some.jsp?key=<%=java.net.URLEncoder.encode("可能包含中文的参数","UTF-8")%>">联结</a>

方法2:Javabean使用java.net.URLEncoder.encode()

在Javabean里使用java.net.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:使用自定义标签。

在自定义标签里使用java.net.URLEncoder.encode()方法处理。

关于自定义标签的具体方法,这里不做介绍。

JSP与SERVLET的连动

JSP经过上面的处理之后,后输出的HTML页面联结已经可以正常向服务器传递中文参数了。

下面我们阐述一下Servlet里怎么接收/解析中文参数。

对于<a href="/someServlet?key=%E4%BD%A0%E5%A5%BD">你好</a>之类的联结,我们可以用下面的servlet来解析传递过来的中文参数。

1.GetAsiaCharServlet.java

2.view plaincopy to clipboardprint?

3.import java.io.IOException;

4.import java.net.URLEncoder;

5.

6.import javax.servlet.ServletException;

7.import javax.servlet.http.HttpServlet;

8.import javax.servlet.http.HttpServletRequest;

9.import javax.servlet.http.HttpServletResponse;

10.

11.public class GetAsiaCharServlet extends HttpServlet {

12.

13.

14. @Override

15. //redir?key=xxxx

16. protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

17. String key = req.getParameter("key");

18.

19. key = <SPAN style="COLOR: #ff0000">new String(key.getBytes("ISO-8859-1", "utf-8"))</SPAN>;

20.

21. System.out.println(keyword);

22. //...

23.

24. //重定向处理

25. //res.sendRedirect("//www.google.com/search?q="+URLEncoder.encode(key, "utf-8"));

26. }

27.}

28.

29.import java.io.IOException;

30.import java.net.URLEncoder;

31.

32.import javax.servlet.ServletException;

33.import javax.servlet.http.HttpServlet;

34.import javax.servlet.http.HttpServletRequest;

35.import javax.servlet.http.HttpServletResponse;

36.

37.public class GetAsiaCharServlet extends HttpServlet {

38.

39.

40. @Override

41. //redir?key=xxxx

42. protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

43. String key = req.getParameter("key");

44.

45. key = new String(key.getBytes("ISO-8859-1", "utf-8"));

46.

47. System.out.println(keyword);

48. //...

49.

50. //重定向处理

51. //res.sendRedirect("//www.google.com/search?q="+URLEncoder.encode(key, "utf-8"));

52. }

53.}

我们注意到使用req.getParameter("key")得到参数后,还使用了new String(key.getBytes("ISO-8859-1", "utf-8"))把ISO-8859-1字符集形式转换成UTF-8形式。

为什么呢?因为iso-8859-1是Java中网络传输使用的标准字符集,req.getParameter("key")得到的还是ISO-8859-1字符集,所以要转换一下才不会是乱码。

后,顺便提一下,采用servlet重定向时,也需要对包含中文文字的参数做特殊处理。

例如,SERVLET从HTML页面的联结接受参数,然后重新定向到Google搜索。则可以在上面的GetAsiaCharServlet里加上如下处理:res.sendRedirect("//www.google.com/search?q="+URLEncoder.encode(key, "utf-8"));

也就是说,需要把参数取出来,转换,再重新使用URLEncoder.encode编码,这样就不会出现乱码现象。

本文标题:Java WEB开发中的中文乱码问题解决,责任编辑:宏鹏,来源:武汉北大青鸟鲁广校区栏目,于2023-01-06 15:47:37发布于北大青鸟鲁广校区。本文旨在探讨解决Java WEB开发中的中文乱码问题。

专业老师指导

赵老师

赵老师

从事IT教育培训十年有余,致力于帮助广大学子找到适合自己的专业

立即在线咨询

培训咨询客服

陈老师

陈老师

IT培训专业客服,用自己的真诚解决了无数学子的困惑

立即在线咨询

本文地址:https://m.027hpedu.com/wenda/java/2822.html

文章标题:Java WEB开发中的中文乱码问题解决

上一篇:20多个常见Bug及其修正方法

下一篇:打造高性能、高流量Java Web站点的22条建议

热点关注

推荐Java开发

热门Java开发

预约你的精彩未来

预约将免费领取7天课程体验卡

-------请选择试预约课程-------

JAVA
WEB前端
PHP
UI设计
Python
电子商务
视频剪辑
大数据工程师
平面设计

83345人已领取

全国百余家校区

只为您方便就学

北大青鸟鲁广校区

北大青鸟鲁广校区

武汉市洪山区珞喻路724号(地铁二号线光谷广场站F口出)

预约到校
领取学习大礼包

首页

热门课程

视频网课

新闻资讯

关于学校

联系学校

预约选课申请

  • 预约时间

    请选择预约时间

  • 预约课程

    请选择预约课程

  • 姓   名
  • 手机号
  • QQ 号
  • 微信号

添加老师微信号

专业老师24小时1对1学习指导

定制专属于你的专属学习方案

微信号:17740513250

复制老师的微信号

复制成功啦

快去微信添加老师为好友吧~

北大青鸟小青

微信号:17740513250

北大青鸟小青

微信号:17740513250

设置备注
小主知道啦