文档章节

servlet 中文乱码问题及解决方案

 三番水
发布于 2013/05/31 15:50
字数 708
阅读 701
收藏 15

一、常识了解

 

1.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立;

2.java.nio.charset.Charset.defaultCharset() 获得平台默认字符编码;

3.getBytes() 是通过平台默认字符集进行编码;

二、中文乱码出现

在学习任何一门技术时,经常会有初学者遇到中文乱码问题,比如MySQL,是因为在安装时没有设置;而在Servlet中,也会遇到中文乱码问题;

比如:

OutputStream out = response.getOutputStream();

out.write(String );

输出中文时可能会出现乱码;

比如:

[java]  view plain copy
  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  2.           
  3.         OutputStream out = response.getOutputStream();  
  4.         String data = "博客";  
  5.         out.write(data.getBytes("UTF-8"));  
  6.     }  


输出乱码的问题是程序用UTF-8编码,而浏览器用GB2312解码,因此会出现乱码;

Servlet乱码分为request乱码和response乱码;

三、response中文乱码

在网上很有效的解决方法是添加:

response.setCharacterEncoding("UTF-8");

解决不了,后来又搜到一条解决方法是:

respnse.setHeader("content-type","text/html;charset=UTF-8");

两句都填上,后来终于解决了这个问题;

其实我们应该思考一下本质;

  

问题1:

我们这里先来说明一下错误的原因,下图是显示乱码的流程图:

response.setContentType("text/html;charset=UTF-8"); 目的是为了控制浏览器的行为,即控制浏览器用UTF-8进行解码;

response.setCharacterEncoding("UTF-8"); 的目的是用于response.getWriter()输出的字符流的乱码问题,如果是response.getOutputStream()是不需要此种解决方案的;因为这句话的意思是为了将response对象中的数据以UTF-8解码后发向浏览器;

解决方案流程图:

 

 

问题2

问题代码如下:

[java]  view plain copy
  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  2.         PrintWriter out = response.getWriter();  
  3.         String data = "博客";  
  4.         out.println(data);    
  5.     }  


浏览器输出: ??

原因:"博客"首先被封装在response对象中,因为IE和WEB服务器之间不能传输文本,然后就通过ISO-8859-1进行编码,但是ISO-8859-1中没有“博客”的编码,因此输出“??”表示没有编码;

错误代码流程图:

而解决方案是:response.setCharacterEncoding("GB2312"); 设置response使用的码表

 

解决方案流程图:

 

 

补充:通过<meta>标签模拟response头;

<meta http-equiv="content-type" content="text/html"/> 等价于 response.setContentType("text/html");


四、request乱码问题

 

request请求分为post和get,对于不同的请求方式有不同的解决乱码的方案;

 

1.post请求乱码

 

错误原因:

 

解决方案:


2.get请求乱码

 

PS:总结下 request的乱码的原因在于http协议只是用ISO-8859-1的字符集传输,所有全部可以通过
new String(str.getBytes("ISO-8859-1"),"UTF-8")的方式来解决。response解决的根本在于传输和显示都是用一种编码。

本文转载自:http://blog.csdn.net/xiazdong/article/details/7217022

粉丝 0
博文 23
码字总数 7525
作品 0
虹口
程序员
私信 提问
jsp、servlet中文乱码终极解决方法

jsp中文乱码终极解决方法 一 找出问题的根源 乱码可能出现的地方:1 jsp页面中 2 jsp页面之间相互传参的参数 3 与数据库中数据的存取 基本归纳为以上几种。 二 寻找解决方案 1 出现在jsp页面...

长平狐
2012/11/12
466
0
jsp简介

Jsp简介 JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计和...

晨曦之光
2012/05/16
297
0
Servlet从浏览器获取数据出现乱码,高手替我解决下

本人java新手,最近初习servlet ,装好TOMCAT 7 之后能正常运行一般JSP和servlet程序,但是我试着用servlet获取html 的表单数据时却发现,只能获取英文,中文就出现乱码,试过了在servlet 的...

浪漫的菜鸟
2010/10/13
1K
3
解决中文乱码问题

在基于JAVA的编程中,经常会碰到汉字的处里及显示的问题,比如一大堆乱码或问号。这是因为JAVA中默认的编码方式是UNICODE,而中国人通常使用的文件和DB都是基于GB2312或者BIG5等编码,故会出...

风吹鸡蛋壳
2009/05/19
9.9K
5
Tomcat 5.5.x JSP中文问题的解决

Tomcat 已经推出了 5.5.x版本,你可以通过这个地址查看新的特性:http://jakarta.apache.org/tomcat/tomcat-5.5-doc/changelog.html 。 说老实话我没有细看这些变化,但是本着对Tomcat的强力...

红薯
2008/10/05
152
0

没有更多内容

加载失败,请刷新页面

加载更多

Spark sql的批处理物理计划BatchScanExec

BatchScanExec是batch类的物理计划,对应的逻辑计划是DataSourceV2Relation,是Datasource。 它的入参是Scan类,Scan类有两个重要方法,一个获取分区列表信息;另一个方法获取读取器工厂。 ...

守望者之父
26分钟前
10
0
for循环与while循环

循环结构三要素 a. 初始值 b. 循环条件 c. 改变条件 for循环 声明格式 for(表达式1;表达式2;表达式3){ 循环体语句 } 表达式1:用来循环的变量初始值。(开始值) 表达式2:用来判断循环的条件。...

Lenat
32分钟前
11
0
进程描述符和内存描述符、进程栈、线程栈、内核栈

进程描述符 task_struct 线程创建的时候,加上了 CLONE_VM 标记,这样 线程的内存描述符 将直接指向 父进程的内存描述符。 内存描述符mm_struct 进程栈:stack 线程栈:使用mmap系统调用分配...

SibylY
33分钟前
12
0
Mybatis之TypeHandler

mybatis-3.4.6.release. TypeHandler在mybatis中是个重要的组件,对statement设置参数还是从Resultset中取值,都会用到它。 List-1 public interface TypeHandler<T> { void setParame......

克虏伯
44分钟前
10
0
js—String的一些方法

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> var str="Hello boy" /** * 在底......

zhengzhixiang
57分钟前
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部