简述

乱码是JAVA开发时经常遇到的问题。主要出现在四种情况:

1.         系统接口之间

2.         POST提交数据

3.         GET提交数据和URL路径

4.         页面乱码

系统接口之间乱码

需要双方定义编码方式。例如:GBK(以下都以GBK为例)。

发送的时候将String按GBK转换为了字节码

out.write(loginStr.get(0).getBytes("GBK"));//out为输出流

接收的时候将字节码按GBK编码转换成String

new String(by, 0, a, "GBK");//by为字节码,a为字节码长度

POST 乱码

一般由Filter设置字符集,开发人员无需关注。

request.setCharacterEncoding("GBK");

特殊情况下,各个Servlet也可以按照上面代码设置。

但要注意,必须在取第一个参数之前就要设置。

另外

(1)   上面这个代码只能设置post提交的request body的编码而不是设置get方法提交的queryString的编码。该方法告诉应用服务器应该采用什么编码解析post传过来的内容。

(2)   HttpServletRequest.getPathInfo()返回的结果是由Servlet服务器解码(decode)过的。

(3)   HttpServletRequest.getRequestURI()返回的字符串没有被Servlet服务器decoded过。

(4)   POST提交的数据是作为request body的一部分。

(5)   网页的Http头中ContentType("text/html; charset=GBK")的作用:

(a)  告诉浏览器网页中数据是什么编码;

(b)  表单提交时,通常浏览器会根据ContentType指定的charset对表单中的数据编码,然后发送给服务器的。

(c)  这里所说的ContentType是指http头的ContentType,而不是在网页中meta中的ContentType。

GET乱码和URL路径乱码

URL路径乱码是指用中文路径,如…/中文路径/test.jsp

GET乱码需要在中间件的配置文件里设置.

(1) tomcat服务器

对于tomcat服务器,该文件是server.xml

<Connector port="8080" PRotocol="HTTP/1.1"

       maxThreads="150" connectionTimeout="20000"

       redirectPort="8443"URIEncoding="GBK"/>

URIEncoding告诉服务器servlet解码URL时采用的编码。

<Connector port="8080" ... useBodyEncodingForURI="true" />

useBodyEncodingForURI告诉服务器解码URL时候需要采用request body指定的编码。

(2) weblogic服务器

对于weblogic服务器,该文件是weblogic.xml

<input-charset>

 <java-charset-name>GBK</java-charset-name>

</input-charset>

另外:

不同的浏览器对于GET方式提交的中文和路径中文都会按照URLEncode自动编码。

(1)   对于中文IE,如果在高级选项中选中总以UTF-8发送(默认方式),则PathInfo是URL Encode是按照UTF-8编码,QueryString是按照GBK编码。

http://localhost:8080/example/ 中国?name=中国

实际上提交是:

GET /example/$E4$B8$AD$E5$9B$BD?name=$D6$D0$B9$FA ($改为%)

(2)     对于中文IE,如果在高级选项中取消总以UTF-8发送,则PathInfo和QueryString是URL encode按照GBK编码。

实际上提交是:

GET /example/$D6$D0$B9$FA?name=$D6$D0$B9$FA ($改为%)

(3)     对于中文firefox,则pathInfo和queryString都是URL encode按照GBK编码。实际上提交是:

GET /example/$D6$D0$B9$FA?name=$D6$D0$B9$FA ($改为%)

很显然,不同的浏览器以及同一浏览器的不同设置,会影响最终URL中PathInfo的编码。对于中文的IE和FIREFOX都是采用GBK编码QueryString。

因此一般情况下,我们尽量使用英文路径,而不是中文路径。提交方式尽量使用POST,如果必须要使用GET方式,请主动将PathInfo和QueryString按配置文件中的编码URLEncode。即:直接按统码转换成$D6$D0$B9$FA此种类型的数据。

页面乱码

浏览器根据http头中的ContentType("text/html; charset=GBK"),指定的字符集来解码服务器发送过来的字节流。

1.         Servlet中调用 HttpServletResponse.setContentType()设置http头的ContentType。

2.         Jsp: <%@ page contentType="text/html;charset=GBK"%>

3.         注意:HttpServletResponse.setContentType("text/xml;charset=GBK");一定要写在PrintWriter out = HttpServletResponse.getWriter();之前。否则会乱码,尤其是使用Ajax时,以前在项目开发过程中出现过这种问题

总结

1.         一般一个系统只使用一个字符集,以免造成混乱。

2.         Filter、配置文件、JSP中的<%@ page contentType="text/html;charset=GBK"%>都必须写。

3.         一般路径不要写中文,不般不要使用中文的get方法(QueryString),特殊情况下需要使用时,主动URLEncode。

4.         接口通信时,双方主动定义一致字符集,按字符集转换成字节码交互。

Java乱码解决的更多相关文章

  1. jsp页面传输到xxAction.java乱码解决

    jsp页面传输到xxAction.java乱码解决:jsp:encodeURI(encodeURI("xx"))java:if(!StringUtils.isBlank(belon ...

  2. Java乱码解决之道

    1.常见字符编码 ASCII编码: ASCII,American Standard Code for Information Interchange,是基于拉丁字母的一套电脑编码系统,主要用于显示现代 ...

  3. java乱码解决方法

    String name = request.getParameter("name"); 乱码解决:String name = new String(request.getParam ...

  4. java中文乱码解决之道(九)-----总结

    乱码,我们前台展示的杀手,可能有些朋友和我的经历一样:遇到乱码先按照自己的经验来解决,如果没有解决就google,运气好一搜就可以解决,运气不好可能够你折腾一番了.LZ之所以写这个系列博客就是因为遇到 ...

  5. java中文乱码解决之道(一)-----认识字符集

    沉寂了许久(大概有三个多月了吧),LZ"按捺不住"开始写博了! java编码中的中文问题是一个老生常谈的问题了,每次遇到中文乱码LZ要么是按照以前的经验修改,要么则是baidu.c ...

  6. java中文乱码解决之道(二)-----字符编码详解:基础知识 + ASCII + GB**

    在上篇博文(java中文乱码解决之道(一)-----认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述字符集.字符编码等基础知识和ASCII.GB的详情. 一.基 ...

  7. java中文乱码解决之道(四)-----java编码转换过程

    前面三篇博客侧重介绍字符.编码问题,通过这三篇博客各位博友对各种字符编码有了一个初步的了解,要了解java的中文问题这是必须要了解的.但是了解这些仅仅只是一个开始,以下博客将侧重介绍java乱码是如何 ...

  8. java中文乱码解决之道(七)-----JSP页面编码过程

    我们知道JSP页面是需要转换为servlet的,在转换过程中肯定是要进行编码的.在JSP转换为servlet过程中下面一段代码起到至关重要的作用. <%@ page language=" ...

  9. Java中文乱码解决

    Jvm内部编码采用的是Unicode编码. 常见的字符编码集:ASCII编码,GBK编码,Unicode编码 UTF-8只是unicode的实现方式之一: UTF-8最大的一个特点,就是它是一种变长的 ...

随机推荐

  1. oracle imp dmp命令

    vi par.txt userid=system/oracle tables=(user.table,...) query="where org_no like 32%" file ...

  2. itext 生成pdf文件添加页眉页脚

    原文来自:https://www.cnblogs.com/joann/p/5511905.html 我只是记录所有jar版本,由于版本冲突及不兼容很让人头疼的,一共需要5个jar, 其中itextpd ...

  3. nginx与PHP的关系和交互方式【转】

    nginx与PHP的关系. 对比, apache和PHP的关系, 将PHP安装成apache的一个功能模块, 导致的结果, 对外只有一个apache程序, PHP并不独立出现, 仅仅是apache的模 ...

  4. easyui datagrid 去掉 全选checkbox

    在加载 表格的时候添加事件:onLoadSuccess 在事件中写入下面句,用空代替原有HTML 达到取消效果. $(".datagrid-header-check").html( ...

  5. [How to] 使用HBase协处理器---Endpoint客户端代码的实现

    1.简介 不同于Observer协处理器,EndPoint由于需要同region进行rpc服务的通信,以及客户端出数据的归并,需要自行实现客户端代码. 基于[How to] 使用HBase协处理器-- ...

  6. 13.Python3标准库--互联网

    (一)urllib.parse:分解url urllib.parse模块提供了一些函数,可以管理URL以及组成部分 1.解析 from urllib.parse import urlparse ''' ...

  7. C/C++——C语言跳出多重循环方法

    c语言的break语句只能跳出离它最近的一层循环,但是我们有时候需要跳出多层循环,以下有几种跳出多重循环的方法: 1. 使用goto ; i < MAX1; i++) { ; j < MA ...

  8. 用PHP去实现数据库查询结果缓存

    有些时候我们希望减少对数据库的查询来提高程序的性能,因为这些数据不是经常变更的,而是会在很长一段时间内都不会变化,因此,我们每连接一次数据库,都会把相应的结果用文件的形式保存起来.比如对于一个商城来说 ...

  9. Python+Selenium 自动化实现实例-数据驱动实例

    #coding=utf-8 from selenium import webdriver driver = webdriver.Firefox() driver.implicitly_wait(10) ...

  10. STL中stack/queue/map以及Boost unordered_map 的使用方法

    一.stackstack 模板类的定义在<stack>头文件中.stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要的,在不指定容器类型时,默认的容器类型 ...