java输出的汉字变成乱码_Java Web项目中解决中文乱码方法总结

一、了解常识:

1.UTF-8国际编码,GBK中文编码。GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立;

2、web tomcat:默认是ISO8859-1,不支持中文的

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

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

二、引入

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

比如:

OutputStream out = response.getOutputStream();

out.write(String );

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

比如:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

OutputStream out = response.getOutputStream();

String data = "博客";

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

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

三、Servlet相关的几种乱码

1、浏览器调用jsp,html等页面中文显示乱码

此情况需满足两个要求:

(1)文件本身是以utf-8编辑保存的(myEclipse中在properties中鼠标右键选择utf-8)

(2)浏览器用utf-8解析:

(手动)==> 在浏览器中右键选择编码格式为utf-8

(智能)==> 在文件中写入如:   通过标签模拟response头,起到告诉浏览器用utf-8的编码解析

(智能)==> response.setContentType("text/html;charset=UTF-8");起到告诉浏览器用utf-8的编码解析

常用:

2、通过浏览器调用servlet,页面显示乱码。

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

(1)response乱码问题

解决方法:

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

response.setCharacterEncoding("UTF-8");

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

response.setContentType("text/html;charset=utf-8");或者response.setHeader("content-type","text/html;charset=UTF-8");告诉浏览器用utf-8解析。(setHeader是HttpServletResponse的方法。如果想在拦截器Filter中设置字符编码,则无此方法,因为Filter的doFilter方法的参数类型是ServletResponse)

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

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

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

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

==>情况一:

问题代码如【引入】的例子

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

0_13277566048xN8.gif

解决方案流程图:

0_1327764503s741.gif

==>情况二:

问题代码如下

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

PrintWriter out = response.getWriter();

String data = "博客";

out.println(data);

}

浏览器输出的结果为: ??

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

错误代码流程图:

0_1327758492AjH3.gif

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

解决方案流程图:

0_1327758281brO4.gif

(2)request乱码问题

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

==>POST请求:

错误原因:

0_132875920805XK.gif

解决方案:

0_1328759212mPoA.gif

==>GET请求(URI方式传递参数乱码):

出现情况:浏览器访问

method="get">

如:

解决方法:问题本质是get方式传递的参数内容默认编码方式问ISO8859-1,而且使用request.setCharacterEncoding("utf-8")也无法解决问题。

法一:要解决这个问题,修改tomcat服务器的配置文件。修改tomcat目录下的conf/server.xml文件的第43行:

修改前内容:

maxThreads="150"   connectionTimeout="200000"

redirecPort="8443"/>

修改后内容:

maxThreads="150"   connectionTimeout="200000"

redirecPort="8443"    URIEncoding="utf-8"/>

法二:String usernameString = new String(username.getBytes("ISO-8859-1"),"UTF-8"); (如下图)

法三:URL转换

0_1328759222QfR3.gif

3、调用数据库出现乱码

安装数据的时候选择UTF-8

四、JSP相关乱码解决方案(部分已经在上面介绍了)

问题描述:通过jsp,html,或servlet中的表单元素把参数提交给对应的jsp或者servlet时,在接收的jsp或servlet中接收到的参数中文显示乱码。

例如:

提交jsp代码如下:

输入表单

用户名:

密   码  :

接收参数的jsp代码如下:

接收表单

request.setCharacterEncoding("utf-8");

%>

用户名:

密     码:

解决方法:在接收post提交的参数前,使用request.setCharacterEncoding("utf-8")设定接收参数的内容格式为utf-8编码。见接收表单中的插入内容即可。当然这种乱码问题最好使用中文过滤器的方法最好。

五、properties文件乱码

问题描述:在使用一些类库或者框架时,为了实现页面内容国际化,需要编写对应的properties文件。而properties文件中的中文内容在显示的时候也会出现乱码。

解决方法:这个乱码问题可以通过jdk中的native2ascii工具解决。使用如下命令:

native2ascii   -encoding   utf-8  display.properties    display_zh_CN.properties

出现乱码问题的原因是因为java编译器只能处理Latin-1或unicode编码的字符文件。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解决 Java Web 项目中文乱码的问题,可以考虑以下几个方法: 1. 设置字符编码:在 JSP 页面,可以通过设置 `pageEncoding` 属性来指定页面编码,例如 `<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>`。在 Java 代码,可以通过 `request.setCharacterEncoding("UTF-8")` 来设置请求的编码。 2. 设置响应头:在 Servlet ,可以通过 `response.setContentType("text/html; charset=UTF-8")` 来设置响应的编码。 3. 使用过滤器:可以通过编写过滤器来统一处理编码问题,例如: ```java public class EncodingFilter implements Filter { private String encoding = "UTF-8"; public void init(FilterConfig config) throws ServletException { if (config.getInitParameter("encoding") != null) { encoding = config.getInitParameter("encoding"); } } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { req.setCharacterEncoding(encoding); resp.setContentType("text/html; charset=" + encoding); chain.doFilter(req, resp); } public void destroy() { } } ``` 然后在 web.xml 配置过滤器: ```xml <filter> <filter-name>EncodingFilter</filter-name> <filter-class>com.example.EncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 4. 采用统一编码:可以将项目的所有文件都采用统一的编码,例如 UTF-8。在 Eclipse ,可以通过设置文件编码来实现。 以上是一些常见的解决方法,具体选择哪种方法取决于具体情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值