网上很多关于GET方式请求中文乱码的解决方案,大体类似. 这里主要讲一下Tomcat在处理URL参数过程中, 究竟是为什么会导致了GET方式请求的中文乱码. 一句话概括就是: Tomcat默认将单字节作为一个字符,但是中文是2个字节表示一个字符....

首先来一个Tomcat解析URL中参数的序列图,其中阴影部分就是造成乱码的地方.

测试场景:

对于一个从官方下载的Tomcat6,不去任何配置.(这里强调不去任何配置主要是指不在Tomcat的server.xml文件中作任何修改.) 

在Tomcat的 webapps/ROOT目录下新建一个test.jsp:

  1. <html>
  2. <head><title></title></head>
  3. <body>
  4. <%
  5. String name = request.getParameter("name" );
  6. System.out.print(name );
  7. %>
  8. </body>
  9. </html>

然后发起这样一个请求 http://localhost:8080/test.jsp?name=ni%D5%C6%B9%F1

(真实面目是:http://localhost:8080/test.jsp?name=ni掌柜 )

接着我们定位到上面阴影部分的代码:

  1. private String urlDecode(ByteChunk bc, String enc)
  2. throws IOException {
  3. if( urlDec==null ) {
  4. urlDec=new UDecoder();
  5. }
  6. urlDec.convert(bc); //这个方法影响不大,只是对那个java.net.URLEncod...编码的进行处理.
  7. String result = null;
  8. if (enc != null) {
  9. //关键问题:如果这里没有指定URIEncoding的话, 那么enc是null
  10. bc.setEncoding(enc);
  11. result = bc.toString();
  12. }
  13. //这个地方如果没有配置URIEncoding,那么走else的流程,所以就会按照字节来
  14. else {
  15. CharChunk cc = tmpNameC;
  16. int length = bc.getLength();
  17. cc.allocate(length, -1);
  18. // Default encoding: fast conversion
  19. byte[] bbuf = bc.getBuffer();
  20. char[] cbuf = cc.getBuffer();
  21. int start = bc.getStart();
  22. for (int i = 0; i < length; i++) {
  23. cbuf[i] = (char) (bbuf[i + start] & 0xff);
  24. }
  25. cc.setChars(cbuf, 0, length);
  26. result = cc.toString();
  27. cc.recycle();
  28. }
  29. return result;
  30. }

在运行过程中可以看到, 到进入这个方法的时候,还没有乱码 :

然后是到urlDec.convert(bc);

这个方法影响不大,只是对那个java.net.URLEncod...编码的进行处理.

关键是下面部分:看上面代码中,如果 enc == null, 也就是说server.xml中没有设置URIEncoding.

那么进入了else代码段.

这一进入就完了,可以看到他的处理是按单字节作为一个字符, 于是上面的 "ni%D5%C6%B9%F1" 在它眼里就是6个字符了 .(实际上 ni掌柜 是4个字符), 所以显然就是乱码. 如下:

那么在server.xml文件中设置了URIEncoding, 比如: URIEncoding="GBK". 于是在上面代码中,就会进入下面代码段:

  1. if (enc != null) {
  2. //关键问题:如果这里没有指定URIEncoding的话, 那么enc是null
  3. bc.setEncoding(enc);
  4. result = bc.toString();
  5. }

如下:

本文转自 nileader 51CTO博客,原文链接:http://blog.51cto.com/nileader/384353,如需转载请自行联系原作者

Tomcat 中 GET方式 请求 中文乱码 出现的原因相关推荐

  1. javaWEB开发中get方式请求的乱码问题解决

    为什么80%的码农都做不了架构师?>>>    我们在日常的开发中难免会遇到一些乱码问题的解决 这个能解决一般get方式乱码问题 public String getStr(Strin ...

  2. 【Servlet】HTTP请求中文乱码的问题

    请求中文乱码 在进行请求参数传递时,经常会遇到请求数据为中文时的乱码问题,当Form表单的文本域中输入中文时会产生乱码问题,出现乱码的原因与客户端的请求编码方式(GET请求或POST请求)以及服务器的 ...

  3. MyEclipse和tomcat结合编写jsp对于中文乱码的解决方法

    一.Java和jsp 中文乱码原因和解决方法: Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦.原因有两方面: 第一方面:J ...

  4. linux mysql插入中文乱码_解决Linux下Tomcat向MySQL插入数据中文乱码问题

    一.问题 在windows上面使用eclipse开发的项目在windows上面运行一切正常,部署到腾讯云时出现向MySQL数据库中插入数据是中文乱码 二.解决办法 1.尝试一 直接在linux上面使用 ...

  5. postmain请求中午乱码_完美解决Get和Post请求中文乱码的问题

    对于Post请求,只需在Servlet或者jsp中写入如下代码就可以把解决从表单中传入的中文乱码问题 request.setCharacterEncoding("utf-8"); ...

  6. linux mysql插入数据乱码_解决Linux下Tomcat向MySQL插入数据中文乱码问题

    一.问题 在windows上面使用eclipse开发的项目在windows上面运行一切正常,部署到腾讯云时出现向MySQL数据库中插入数据是中文乱码 二.解决办法 1.尝试一 直接在linux上面使用 ...

  7. Activiti保存.png 流程图片文件且解决idea中保存图片时显示中文乱码的解决方法

    Activiti保存.png 流程图片文件且解决idea中保存图片时显示中文乱码的解决方法 Eclipse 工具中的操作 流程图片生成的两种方式: 使用 activiti-designer 设计流程图 ...

  8. IntelliJ IDEA 2018.3.3配置 Tomcat 9,控制台出现中文乱码 “淇℃伅”(2019/01/25)

    转载:IntelliJ IDEA 2018.3.3配置 Tomcat 9,控制台出现中文乱码 "淇℃伅"(2019/01/25) - What'_up - 博客园(win10系统) ...

  9. 解决get请求中文乱码问题

    在很多情况下get请求会发生中文乱码的情况,而换做post就不会,这其中的根本原因是get请求默认的是使用"iso-8859-1"编码,接下来介绍两种种解决get请求编码的方法 1 ...

最新文章

  1. 数据结构之shell排序
  2. R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(手动编码添加均值、标准偏差)实战(dot plot)
  3. 【Netty】ChannelHandler和ChannelPipeline
  4. latex常见编译错误和细节
  5. python【蓝桥杯vip练习题库】ADV-69质因数(数论)
  6. 关于ASP.Net的导入导出的[转]
  7. Leetcode PHP题解--D16 922. Sort Array By Parity II
  8. Mercury:唯品会全链路应用监控系统解决方案详解
  9. 将数组放进集合中的简单方法
  10. BZOJ 1444 [JSOI2009]有趣的游戏 (AC自动机、概率与期望DP、矩阵乘法)
  11. JavaFX Chart设置数值显示
  12. 常用的几款工具让 Kubernetes 集群上的工作更容易
  13. php_self include,PHP_SELF返回/index.php/index.php
  14. ab plc软件_从GuardLogix 和 CIP Safety认识安全PLC控制器
  15. 适配器模式的极简概述
  16. Html 中表单提交的一些知识总结——防止表单自动提交,以及submit和button提交表单的区别...
  17. 在sql中如何插入数据
  18. vba随机抽取人名不重复_用vb编写个随机滚动抽取人名的抽奖系统,怎么样做到不重复并添加一个记录显示已抽到的人名...
  19. 51单片机实现蜂鸣器播放天空之城
  20. 晶体管放大电路与Multisim仿真学习笔记

热门文章

  1. java万能爬虫爬取拉勾网
  2. 远程操控计算机,将手机平板与电脑连接起来--随时办公
  3. 北京四十岁男人的生活帐单
  4. Acme CAD Converter 2019(DWG转换器) v8.9.8.1500简体中文精简优化版
  5. JSON Shema 校验JSON内容
  6. springMVC和mybatis的框架搭建
  7. JS And Vue代码调试——IDEA+JS+vue-devtools-dev+JetBrains IDE Support(Chrome插件)
  8. 未来五年,物联网三大技术发展趋势!
  9. 坦克大战第一节——画出自己的坦克(新手篇)
  10. 54/74系列逻辑芯片