相信很多初学者在刚开始使用Tomcat的时候都被中文乱码问题所困扰过,我曾经也遇到了这个问题,苦苦搜寻各大社区,看了无数帖子,结果依然没有解决问题。原因有两个,一是我比较笨<,二是确实这个问题过于基础,网上解决方案也比较含糊。所以很难找到完整整理出来的解决这个问题的思路。今天我来整理一下。

首先,要知道为什么会出现这个问题。Tomcat的默认编码是ISO-8859-1这,是不支持中文的。但我们的javaweb项目又大部分使用UTF-8或者GBK这样支持中文的编码开发,所以当我们吧项目的内容给服务器解析时,如果不做任何处理,Tomcat就默认使用ISO-8859-1来解析,乱码自然就产生了。当然,Tomcat的编码也不是不可以改变的,就是到Tomcat的\conf目录下找到server.xml文件,打开并找到:<Connector port="8080" protocol="HTTP/1.1"  connectionTimeout="20000" redirectPort="8443" />这段代码。

然后改成这样:

就是加上一句:URIEncoding="UTF-8"

可是,问题并没有这么简单。相信很多人也试过了,这样改过之后,编码问题依然存在。(而且并不建议这样更改,建议让服务器保持默认编码)

为什么? 我们先梳理下这个过程。

在我们把项目发到Tomcat,然后通过浏览器访问的过程中,有三个涉及到编码的地方:

一:你使用IED(一般是eclipse)使用的编码,这是你项目从头到尾原始不变的编码。

二:Tomcat的编码,默认IOS-8859-1,更改server.xml中的编码格式,只是更改了Tomcat对get请求的解析编码,也就是说,改这个地方只是告诉Tomcat对所有的get请求采取指定的编码来解码,然而遇到post请求时,依然用默认编码解码。而且一般不建议更改server.xml中默认编码,我们可以通过别的方式来处理请求编码。

三:浏览器的编码。IE和Firefox默认使用GB2312,Google默认使用UTF-8(反正是不统一的)

我们知道我们在用浏览器想服务器发送页面请求,到服务器响应反馈数据这个过程中,数据都是以字节的形式传输的,就是说,地址栏的信息需要被服务器重新解析成字符,而服务器反馈的字节数据也会被浏览器重新解析过来。所以,要解决乱码问题,我们必定需要让服务器知道,该怎么解析请求,以及让浏览器知道,该怎么解析响应数据。

一:指定服务器处理请求的编码:这一般是在处理post请求才会遇到(一般是提交表单数据),只需要在处理请求的对应servlet中处理request请求的编码,即在获取参数之前 调用 request.setCharacterEncoding("utf-8");

如果IDE指定的GBK也可以改成GBK.

由于request.setCharacterEncoding("utf-8");方法只对请求体有效,但对于get而言,没有请求体,所以此方法只对post请求体中的参数有效,除了路径以外和附带参数还有cookie以外,请求头其他地方一般不会出现中文(即http://localhost:8080/a/b.jsp?name="张三"或http://localhost:8080/哈哈/呵呵.jsp),一般情况不建议url中出现中文的,但如果出现,需要使用URL编码处理,否则无法发送给服务器。这可以用javascript来完成。

例如:

<script type="text/javascript">
      function _go(){
      loction="http://localhost:8080/a/b.jsp?name="+encodeURI("张三");
      }
     </script>

<a href="javascript:_go();">链接</a>

如果希望在Cookie中使用中文,那么先需要对中文进行URL编码,然后把编码后的字符串放到Cookie上。例如:

String name = URLEncoder.encode("姓名","UTF-8");
String value = URLEncoder.encode("张三","UTF-8");
Cookie c = new Cookie(name,value);
response.addCookie(c);

服务器会自动识别数据是否使用来URL编码,如果使用了服务器会自动把数据解码。

二:指定响应编码:如果是jsp或html页面,可以设置相应头

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">来告诉浏览器用什么编码解析,但一定要和IDE编辑时的编码一样,否则依然乱码。

在jsp中还需要注意在第一句的page标签中 pageEncoding="utf-8"也要保持一致。

如果是在servlet中通过respond响应,那么也需要在HttpServlet添加:response.setContentType("text/html;utf-8");或者response.setCharacterEncoding("UTF-8");

响应post请求:

响应get请求:

需要注意的是,要把这句话尽可能放得靠前。一定要在流开启之前调用。

另外,response.setContentType("text/html;utf-8");这句话有两个作用,一个是告诉浏览器改用“text/html”格式解析页面,一个让浏览器使用“UTF-8”解析数据,包含了response.setCharacterEncoding("UTF-8");这句话的作用,所以一般调用前面那句就够了。

这样基本可以解决Tomcat乱码问题。

解决javaweb Tomcat中文乱码的完整思路。相关推荐

  1. Linux麒麟系统中文乱码,ubuntu麒麟系统tomcat中文乱码怎么办?ubuntu tomcat中文显示乱码解决方法...

    在ubuntu麒麟系统中安装tomcat后,用户在搭建Demo程序的过程中有遇到tomcat中文显示乱码的情况,一般乱码都是因为编码问题导致的,而如果大家的编码设置是正确的话就是下面的原因导致的,遇到 ...

  2. Tomcat中文乱码问题的原理和解决方法

    为什么80%的码农都做不了架构师?>>>    Tomcat中文乱码问题的原理和解决方法 自从接触Java和JSP以来,就不断与Java的中文乱码问题打交道,现在终于得到了彻底的解决 ...

  3. 解决IDEA控制台中文乱码问题(Tomcat、动态网页项目)

    博主在使用idea的创建动态网页的时候,遇到了控制台中文乱码问题,在网上参考了多种解决方案之后,终于将问题成功解决.现在将自己遇到问题的情况和解决问题的方法总结如下: Idea控制台中文乱码问题通常有 ...

  4. 使用过滤器(Filter)解决请求参数中文乱码问题(复杂方式)

    前述: 在写这篇笔记之前,对笔记中的设计模式进行介绍: 本篇笔记中将要使用到的设计模式是:装饰(包装)设计模式 (1)装饰(包装)设计模式口诀: ①定义一个类,实现被装饰对象的接口 ②定义一个成员变量 ...

  5. python idea控制台中文乱码_python 解决cv2绘制中文乱码问题

    python 解决cv2绘制中文乱码问题 因为使用cv2.putText() 只能显示英文字符,中文会出现乱码问题, 因此使用PIL在图片上绘制添加中文,可以指定字体文件. 大体思路: OpenCV图 ...

  6. python 中文乱码_python 解决cv2绘制中文乱码问题

    前几天在公司敲出了个BUG,硬是让我头疼了一阵子,没想到BUG的起因竟是一点小小的细节问题,唉!被折磨的够呛,又让我想起那时候遇到的python cv2绘制中文乱码,差不多也是同样的感受. 为此今天我 ...

  7. 关于Tomcat中文乱码问题的探究

    关于Tomcat中文乱码 最近在复习servlet的时候发现了令人困扰的tomcat中文乱码问题,查阅tomcat源码并且Debug最终找到乱码的罪魁祸首. 默认情况下,浏览器对post提交的中文数据 ...

  8. java解决properties中中文乱码问题

    Java解决properties中中文乱码的问题 Properties文件介绍 与Properties文件的前世今生 native2ascii.exe的使用 首先编写配置文件 实验 修改测试代码进行更 ...

  9. 解决Idea的中文乱码问题

    第一步:首先进入到Idea的安装目录下,找到idea64.exe.vmoptions文件和idea.exe.vmoptions文件,在文件末尾添加-Dfile.encoding=UTF-8 第二步:在 ...

最新文章

  1. 在3ds Max和Vray中创建赛博朋克圣诞老人室内场景
  2. 数据结构与算法:22 精选练习50
  3. python官网 中文版 新闻-用python看新闻
  4. Android下 scrollview的滚动停止事件的监听方法
  5. 比特币如何达成共识 - 最长链的选择
  6. 打造vim的python编辑器
  7. mysql中nvl_Mysql中类似于oracle中nvl()函数的ifnull()函数
  8. SAP ABAP实用技巧介绍系列之 关于View framework处理Before save event的讨论
  9. 他95年出生,却拥有10年编程经验
  10. python 类中定义列表_Python3中的自定义列表类,具有
  11. 通配符在DNS系统中的应用
  12. oracle增量备份0级,oracle_linux自动运行rman增量备份脚本,一、增量备份脚本0级备份脚本...
  13. java调python报错Cannot create PyString with non-byte value
  14. Intellij插件之JRebel
  15. 解决python最新版无法安装TensorFlow,导入TensorFlow
  16. IO Visor Project Use Cases
  17. 图像处理之形态学梯度计算
  18. 【M365运维】Outlook会议室查找工具找不到会议室
  19. 硬盘的结构和介绍,硬盘MBR详细介绍(超详细彩图)
  20. Vmware虚拟机NAT模式设置IP

热门文章

  1. qt-help学习之路(1)QT与C++ 笔记
  2. google网站打不开
  3. nil在linux中的含义,使用NIL表示空节点的目的是什么?
  4. 移动端踩坑记---------ios下输入法遮挡input
  5. (二)BPMN2.0规范介绍——2事件 Events
  6. 《亮剑》太棒了...
  7. 使用定位CLLocationManager时,设置了代理,但是不走代理方法
  8. 学习方向: Learning direction:
  9. 内网如何架设传奇世界私服 (包含传送,脚本教程,专用怪物,不定期更新)...
  10. CUDA之Thread、Wrap执行详解