Java乱码解决
简述
乱码是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乱码解决的更多相关文章
- jsp页面传输到xxAction.java乱码解决
jsp页面传输到xxAction.java乱码解决:jsp:encodeURI(encodeURI("xx"))java:if(!StringUtils.isBlank(belon ...
- Java乱码解决之道
1.常见字符编码 ASCII编码: ASCII,American Standard Code for Information Interchange,是基于拉丁字母的一套电脑编码系统,主要用于显示现代 ...
- java乱码解决方法
String name = request.getParameter("name"); 乱码解决:String name = new String(request.getParam ...
- java中文乱码解决之道(九)-----总结
乱码,我们前台展示的杀手,可能有些朋友和我的经历一样:遇到乱码先按照自己的经验来解决,如果没有解决就google,运气好一搜就可以解决,运气不好可能够你折腾一番了.LZ之所以写这个系列博客就是因为遇到 ...
- java中文乱码解决之道(一)-----认识字符集
沉寂了许久(大概有三个多月了吧),LZ"按捺不住"开始写博了! java编码中的中文问题是一个老生常谈的问题了,每次遇到中文乱码LZ要么是按照以前的经验修改,要么则是baidu.c ...
- java中文乱码解决之道(二)-----字符编码详解:基础知识 + ASCII + GB**
在上篇博文(java中文乱码解决之道(一)-----认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述字符集.字符编码等基础知识和ASCII.GB的详情. 一.基 ...
- java中文乱码解决之道(四)-----java编码转换过程
前面三篇博客侧重介绍字符.编码问题,通过这三篇博客各位博友对各种字符编码有了一个初步的了解,要了解java的中文问题这是必须要了解的.但是了解这些仅仅只是一个开始,以下博客将侧重介绍java乱码是如何 ...
- java中文乱码解决之道(七)-----JSP页面编码过程
我们知道JSP页面是需要转换为servlet的,在转换过程中肯定是要进行编码的.在JSP转换为servlet过程中下面一段代码起到至关重要的作用. <%@ page language=" ...
- Java中文乱码解决
Jvm内部编码采用的是Unicode编码. 常见的字符编码集:ASCII编码,GBK编码,Unicode编码 UTF-8只是unicode的实现方式之一: UTF-8最大的一个特点,就是它是一种变长的 ...
随机推荐
- skb_reserve(skb,2)中的2的意义
skb_reserve() skb_reserve()在数据缓存区头部预留一定的空间,通常被用来在数据缓存区中插入协议首部或者在某个边界上对齐.它并没有把数据移出或移入数据缓存区,而只是简单地更新了数 ...
- linux用户修改用户shell
要拒绝系统用户登录,可以将其shell设置为/usr/sbin/nologin或者/bin/false # usermod -s /usr/sbin/nologin username 或者 # use ...
- NuGet Package Explorer上传时报:failed to process request:'Method Not Allowed'错误解决办法
相关日志:PUT /api/v2/package - 1000 - NuGet+Package+Explorer/3.15.0.0+(Microsoft+Windows+NT+6.2.9200.0) ...
- UVA题解一
UVA 100 题目描述:经典3n+1问题在\(n \leq 10^6\)已经证明是可行的,现在记\(f[n]\)为从\(n\)开始需要多少步才能到\(1\),给出\(L, R\),问\(f[L], ...
- BZOJ 2049: [Sdoi2008]Cave 洞穴勘测——LCT
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2049 省选之前来切一道数据结构模板题. 题意 这是一道模板题. N个点,M次操作,每次加边/ ...
- C/C++——C语言数组名与指针
版权声明:原创文章,转载请注明出处. 1. 一维数组名与指针 对于一维数组来说,数组名就是指向该数组首地址的指针,对于: ]; array就是该数组的首地址,如果我们想定义一个指向该数组的指针,我们可 ...
- Error -27796: Failed to connect to server "ip地址": [10060] Connection timed out
如果出现Error -27796: Failed to connect to server "ip地址": [10060] Connection timed out 这样的错误,如 ...
- Eloquent中一些其他的create方法
firstOrCreate/ firstOrNew# 还有两种其它方法,你可以用来通过属性批量赋值创建你的模型:firstOrCreate 和firstOrNew.firstOrCreate 方法将会 ...
- Linux下的各类文件
.a文件是静态链接库文件.所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分.当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源.. ...
- 详解Oracle的unlimited tablespace系统权限
1. 系统权限unlimited tablespace是隐含在dba, resource角色中的一个系统权限. 当用户得到dba或resource的角色时, unlimited tablespace系 ...