jsp 输出内容乱码问题

解决的需要三个地方

1、jsp头有三处和编码合适有关

2、更改tomcat的server

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

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

增加红色部分

3、如果此时还是乱码

对于get请求 则添加request.setCharacterEncoding("编码格式例如GBK");

下面内容转自他人成果http://blog.csdn.net/xiazdong/article/details/7217022

一、常识了解

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

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

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

二、中文乱码出现

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

比如:

OutputStream out = response.getOutputStream();

out.write(String );

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

比如:

[java] view plaincopy

  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. OutputStream out = response.getOutputStream();

  3. String data = "博客";

  4. out.write(data.getBytes("UTF-8"));

  5. }

输出乱码的问题是程序用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 plaincopy

  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请求乱码

第二篇内容:http://blog.csdn.net/haojiahj/article/details/17060069

pageEncoding与charset区别

pageEncoding是设置的JSP页面源代码的字符编码格式,如果该项的值是utf-8,则JSP源代码里不能写汉字了,如果你用的是eclipse等工具的话,保存时他会提示有一个错误,改成gbk就没事了,就是这个道理

charset是请求服务器以后返回过来的内容的字符编码(当浏览器得到此文件时以什么方式解码),即使pageEncoding设置了gbk,保存,运行程序,查看页面时会发现刚才写的汉字不能正常显示,把charset改成gbk,正常。

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>

<%@ page contentType="text/html;charset=ISO-8859-1"%>

<html>

<head>

<title>你好</title>

</head>

<body>

你好 <br>

</body>

</html>

会产生乱码,因为存为UTF-8的文件被解码为iso8859-1,这样 如有中文肯定出乱码。

Charset可以修改为GBK


response和request的setCharacterEncoding 区别

request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");

request.setCharacterEncoding():是设置从request中取得的值或从数据库中取出的值。

指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默认使用iso8859-1编码。值得注意的是在执行setCharacterEncoding()之前,不能执行任何getParameter()。而且,该指定只对POST方法有效,对GET方法无效。分析原因,应该是在执行第一个getParameter()的时候,java将会按照编码分析所有的提交内容,而后续的getParameter()不再进行分析,所以setCharacterEncoding()无效。而对于GET方法提交表单是,提交的内容在URL中,一开始就已经按照编码分析提交内容,setCharacterEncoding()自然就无效。

get需在Tomcat的server.xml中的:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"

URIEncoding="GBK" />

)加入URIEncoding="GBK",解决get请求乱码问题response.setContentType("text/html;charset=gb2312"):是设置页面中为中文编码。即以哪种编码返回给客户端。

前者是设置动态文字(参数,数据库),后者设置页面静态文字

response.setContentType指定
返回给客户端的编码,同时指定了浏览器显示的编码. 

response.setCharacterEncoding设置HTTP 响应的编码,如果之前使用response.setContentType设置了编码格式,则使用response.setCharacterEncoding指定的编码格式覆盖之前的设置.与response.setContentType相同的是,调用此方法,必须在getWriter执行之前或者response被提交之前.

时间: 2024-08-24 13:44:10

jsp 输出内容乱码问题的相关文章

[小问题笔记(六)] JS已执行成功,输出内容乱码

问题:JS输出的内容出现了乱码.如图: 分析:既然年和月的数字可以正常显示,证明js加载和执行都没有问题 解决:把js引用处的编码方式改成当前页面编码一致.charset="gb2312"(反正不是gb2312就是UTF-8) <script type="text/javascript" src="/Js/My97DatePicker/WdatePicker.js" charset="gb2312"></sc

Java应用程序中System.out.println输出中文乱码

Java应用程序中System.out.println输出中文乱码 2013-12-10 21:27:08cnblogs.com-bluepoint2009-点击数:3631 其实,解决办法比较简单,即:编译时指定编码为UTF-8,如: 1 javac -encoding utf-8 HelloJava.java 这样,再运行时就不会出现乱码. 一.中文问题的来源 计算机最初的操作系统支持的编码是单字节的字符编码,于是,在计算机中一切处理程序最初都是以单字节编码的英文为准进行处理.随着计算机的发

jsp之中文乱码问题

在eclipse里面我们的jsp页面如果我们写了中文,保存的时候会弹出一个框,让你选择保存方式,之所以这样是因为jsp默认的文件编码是ISO-8859-1字符集中无中文字符. 一个比较好的解决办法是在这个jsp页面的开头添加如下一句: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %> 就可以保存了,切在服务器运行了之后,再去页面浏览的时候也是正常

(转载)关于JSP和Servlet乱码处理

JSP和Servlet的中文乱码处理 前几天学习了JSP和Servlet中有关中文乱码的一些问题,写成了博客,今天进行更新一下.应该是可以解决日常的乱码问题了.现在作以下总结希望对需要的人有所帮助.我也是刚学,所以有不足之处希望谅解. 一.表单提交时出现乱码: 在进行表单提交的时候,经常提交一些中文,自然就避免不了出现中文乱码的情况,对于表单来说有两种提交方式:get和post提交方式.所以请求的时候便有get请求和post请求.以前我一直以为get请求和post请求方式出现的乱码的解决方式是一

上传文件时并顺便将文件压缩时出现文件名乱码以及文件内容乱码解决方案

1.文件名乱码 这是因为压缩文件的包(也就是类)的问题: import java.util.zip.ZipOutputStream; 这个引入的包对汉语乱码,对数字和字母没事: 解决: 应该引入此包: import org.apache.tools.zip.ZipOutputStream; import org.apache.tools.zip.ZipEntry;import java.nio.charset.Charset; 2.文件内容乱码: outputStream.putNextEntr

黑马day06 jsp之中文乱码&amp;原理&amp;解决方案

我们可以发现我们的工具eclipse或者myeclipse有很强的功能,我们很少见到jsp页面的乱码问题,这是为什么呢?这是因为eclipse很智能,会根据pageEncoding="UTF-8"这个page指令,保存的时候就会提前预知服务器要使用utf-8进行解码,因此保存的时候会根据pageEncoding="UTF-8"智能的为我们写的jsp保存为utf-8格式.但是当我们使用记事本或者其他文本工具进行开发,就会很容易造成乱码,这里我将详细的分析乱码的原因,以

PHP使用文件流下载文件方法(附:解决下载文件内容乱码问题)

记得高中时候做过游戏私服,那时候的游戏主页是用PHP写的,因为文件很固定,客户端,登陆器和一些小工具,文件数目也不是很多,所以都是直接把下载链接写死的,直接链接到本地服务器的文件目录,今天QQ群有个朋友突然问我用文件流做PHP下载功能,顺手写了个小Demo,代码很简单,注释也全,直接上代码吧~ 1.flush — 刷新输出缓冲 2.ob_clean — 清空(擦掉)输出缓冲区 此函数用来丢弃输出缓冲区中的内容. 此函数不会销毁输出缓冲区,而像 ob_end_clean() 函数会销毁输出缓冲区.

PrintWriter 输出信息乱码

异步方式,返回json给前台时,向前台输出信息使用PrintWriter,但是在输出的过程中,出现乱码的情况. 于是我想起来response.setCharacterEncoding("utf-8");设置页面编码,以及response.setContentType("text/html; charset=utf-8");设置内容类型编码,但是在实验后不成功,乱码依旧. PrintWriter out = response.getWriter(); response

jsp中文显示乱码的解决办法

表单提交时,获取输入的中文参数时,浏览器会出现中文乱码,这时在表单响应的jsp文件中加入request.setCharacterEncoding("utf-8");即可解决.相关代码如下: 附:表单提交的jsp文件内容: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.g