各种乱码问题

乱码解决

一 乱码产生的原因及解决方案

1. 开发环境乱码(代码乱码)

由于Java默认使用UTF-8编码,而且网上很多人都建议java开发的时候应尽量选用UTF-8做为默认编码,而非GBK。IDE使 用Eclipse/IDEA,在第一次使用Eclipse的时候应将default text editor改为UTF-8编码。

2. POST请求乱码

Http协议中规定,数据的传输采用字节编码方式,即无浏览器提交的数据所包含的中文是什么字符编码格式,一旦由浏览器经过Http协议传输,则这些数据均将以字的形式上传给服务器。 因为 HTTP 协议的底层使用的是TCP 传输协议。 TCP (Transmission ControlProtocol) 传输控制协议
,是一种面向连接的、可靠的、基于字节流的、端对端通信协议。在请求中,这些字节均以开头,并以十六进形式出现。如 %5A%3D 等。

当用户通过浏览器提交一个包含UTF-8编码格式的两个字中文请求时,浏览器会将这两个中文字符变为六个字节一般一个 UTF 8 汉字占用三个字节),即形成六个类似%8E的字节表示形式,并将这六个字节上传至Tomcat服务器。Tomcat服务器在接收到这六个字节后,并不知它们原始采用的是什么字符编码。
而Tomcat默认的编码格式为ISO8859-1。所以会将这六个字节按照ISO8859-1的格式进行编码,这种编码方式不支持中文,这样就出了乱码。

方法1:req.setCharacterEncoding("UTF-8") 每个Servlet的Post请求进行编写只对Post请求有效

方法2:使用SetCharacterEncodingFilter,这个很基础的一套过滤器,过滤器里面编写req.setCharacterEncoding("UTF-8")将所有来自页面的POST请求全部过滤为UTF-8编码。

方法3:该方式无需设置Tomcat 中的 server.xml 中的 Tomcat 默认字符编码,无需设置request的请求体的字符编码。从数据在请求中的存放形式,到数据被Tomcat中的 
Servlet 接收到后的存放形式,均是由单个字节的形式存在,而在众多字符编码格式中,ISO8859-1为单字节编码,
所以,首先以ISO8859-1的形式先对单字节的数据进行编码,并将编码后的数据存放在字节数组中。然后,再将字节数组中的数据,按照指定的UTF-8格式进行解码,即变为了需要的 UTF- 8 字符编码的数据,解决了中文乱码问题。
编码,即重新编排,即打散,将字符串 打散后按照指定编码进行重新编排。 这里的编码使用的是 String 的 getBytes() 方法,完成的工作是:按照当前字符编码将数据打散。  

解码,即解释执行,即组装,对打散的字符按照指定编
码组装后进行解释执行。这里的解码使用的是StringStrin g的带参构造器,完成的工作是:按照原有字符编码将数据 组装。的带参构造器,完成的工作是:按照原有字符编将数据组装。
example:
byte[] bytes = name.getBytes("ISO8859-1");
System.out.println("字节长度"+bytes.length);
String names = new String(bytes, "UTF-8");
注意:该方式针对POST与与GET提交方式,均起作用。

3. JSP 页面乱码

将JSP页面全部改为charset=UTF-8,这样可以保证与后台交互的时候都是UTF-8编码,一般应用做了以上工作就基本可以应付了。

4. 资源文件中汉字转化UTF-8字符问题

国际化问题,在使用资源文件的时候,由于中文在properties文件中无法被程序所识别,需要将其进行转码,我在资源文件下面制作了一个很简单的 bat文件,每次修改资源文件的时候都是在一个临时文件中修改,然后执行这个bat文件,将其转化并保存为所需要的资源文件。

5. GET请求乱码

如果在本项目中采用了get方式提交请求并附加参数,结果导致编码乱码,原因是Tomcat默认请求编码是ISO8859,需要在Tomcat的配置文件 server.xml添加一个参数,URIEncoding=”UTF-8”,这样请求中附件的参数就会以UTF-8来进行编码。不建议,如果服务器有多个虚拟服务器,修改后会重启多个应用程序
可以使用2.3中的通用方法。

6. IDEA下tomcat启动后 server乱码,Tomcat Catalina Log乱码

Windows系统的cmd是GBK编码的,所以IDEA的下方log输出的部分的编码也是GBK的,然而Tomcat 9.0 版本默认log输出是UTF-8编码的,采用了两种不同的编码方式就会导致乱码。只要保持E:\development tool\tomcat9.0\apache-tomcat-9.0.12\conf\logging.properties文件的编码集和IDEA运行环境的编码集和Tomcat运行配置在虚拟机选项,这三者保持一致的编码集(默认推荐UTF-8)一样就可解决server控制台和Tomcat log乱码问题

方法1:修改Tomcat 日志输出为GBK编码,与系统CMD匹配
先打开tomcat的安装目录编辑conf目录下的logging.properties用notepad++打开,把里面的UTF-8通通改成GBK,大家都是GBK编码,那就不会乱码了,保存,重启Tomcat,即可生效。

方法2:修改IDEA运行环境为UTF-8编码点击顶部--帮助--编辑自定义VM选项然后把UTF-8加进去-Dfile.encoding=UTF-8最后一步,把Tomcat也指定UTF-8编辑Tomcat运行配置
在虚拟机选项中加入 -Dfile.encoding=UTF-8改完之后,重启IDEA即可。
7.响应的乱码问题

产生原因:之所以响应时会产生乱码,是因为 HTTP 协议中规定,默认响应体的字符编码为ISO-8859-1 。所以,若要解决乱码问题,就需要修改响应体的默认编码。

解决方案:


response.setContentType("text/html“);//设置MIME类型
response.setCharacterEncoding(“UTF-8”);

修改 MIME 的字符编码,即修改响应体的字符编码。但使用 setCharacterEncoding() 方法的前提是,之前必须要通过使用方法 setContentType() 方法设置响应内容的 MIME 类型。否则 setCharacterEncoding() 方法不起作用。


response.setContentType(“text/html;charset=UTF-8”);
 用于 设置响应 内容 的 MIME 类型 ,其中可以指定 MIME 的字符编码。而 MIME 的字符编码,即响应体的字符编码 。

①②是一样的,没啥区别!!!

浏览器会根据响应体字符编码,自动调整其对响应体内容的解码方式,即会使用响应体的字符编码显示响应体内容。不过,需要注意一点,这些设置,必须在PrintWriter 对象产生之前先设置,否则将不起作用。

8.重定向的乱码解决方式

//底层按字节流传输,打散
name = URLEncoder.encode(name, “UTF-8”);

//另一边接收
//组装
name = URLDecoder.decode(name, “UTF-8”);byte[] bytes = name.getBytes(“ISO8859-1”);name = new String(bytes, “UTF-8”);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值