JavaWeb项⽬中解决中⽂乱码⽅法总结
⼀、了解常识:
1.UTF-8国际编码,GBK中⽂编码。GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成⽴;
2、web tomcat:默认是ISO8859-1,不⽀持中⽂的
3.java.nio.charset.Charset.defaultCharset() 获得平台默认字符编码;
⼆、引⼊
在学习任何⼀门技术时,经常会有初学者遇到中⽂乱码问题,⽐如MySQL,是因为在安装时没有设置;⽽在Servlet中,也会遇到中⽂乱码问题;
⽐如:
OutputStream out = OutputStream();
out.write(String );
输出中⽂时可能会出现乱码;
⽐如:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
OutputStream out = OutputStream();
String data = "博客";
out.Bytes("UTF-8"));
date转化为string输出乱码的问题是程序⽤UTF-8编码,⽽浏览器默认⽤GBK解码了,因此会出现乱码;
三、Servlet相关的⼏种乱码
1、浏览器调⽤jsp,html等页⾯中⽂显⽰乱码
此情况需满⾜两个要求:
(1)⽂件本⾝是以utf-8编辑保存的(myEclipse中在properties中⿏标右键选择utf-8)
(2)浏览器⽤utf-8解析:
结巴分词 python 教程(⼿动)==> 在浏览器中右键选择编码格式为utf-8
(智能)==> 在⽂件中写⼊如: <meta name="content-type" content="text/html; charset=UTF-8">  通过<meta>标签模拟response头,起到告诉浏览器⽤utf-8的编码解析
(智能)==> response.setContentType("text/html;charset=UTF-8");起到告诉浏览器⽤utf-8的编码解析
常⽤:
<meta name="content-type" content="text/html; charset=UTF-8">或<meta charset="utf-8">
<%@ pageEncoding="utf-8"%>
<?xml encoding="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");⽬的是⽤于Writer()输出的字符流的乱码问题。如果是OutputStream()是不需要此种解决⽅案的,因为这句话的意思是为了将response对象中的数据以UTF-8解码后的字节流发向浏览器;
==> 情况⼀:
问题代码如【引⼊】的例⼦
我们这⾥先来说明⼀下错误的原因,下图是显⽰乱码的流程图:
解决⽅案流程图:
==>情况⼆:
问题代码如下
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = Writer();
String data = "博客";
out.println(data);
}
浏览器输出的结果为:??
原因:"博客"⾸先被封装在response对象中,因为IE和WEB服务器之间不能传输⽂本,然后就通过ISO-8859-1进⾏编码,但是ISO-8859-1中没有“博客”的编码,因此输出“??”表⽰没有编码;
错误代码流程图:
⽽解决⽅案是:response.setCharacterEncoding("GB2312"); 设置response使⽤的码表
解决⽅案流程图:
(2)request乱码问题
request请求分为post和get,对于不同的请求⽅式有不同的解决乱码的⽅案;
==>POST请求:
错误原因:
解决⽅案:字符串长度怎么算c语言xab107a
==>GET请求(URI⽅式传递参数乱码):
出现情况:浏览器访问<a href=""><form method="get">
如:<a href="/webproject/display.jsp?username=张三&password=123">显⽰⽤户名和密码</a>
解决⽅法:问题本质是get⽅式传递的参数内容默认编码⽅式问ISO8859-1,⽽且使⽤request.setCharacterEncoding("utf-8")也⽆法解决问题。
法⼀:要解决这个问题,修改tomcat服务器的配置⽂件。修改tomcat⽬录下的l⽂件的第43⾏:
修改前内容:
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="150"  connectionTimeout="200000"
redirecPort="8443"/>
修改后内容:
drop table abc的含义<Connector port="8080" protocol="HTTP/1.1"
maxThreads="150"  connectionTimeout="200000"
jsp中文全称redirecPort="8443"    URIEncoding="utf-8"/>
法⼆:String usernameString = new Bytes("ISO-8859-1"),"UTF-8"); (如下图)
法三:URL转换
3、调⽤数据库出现乱码
安装数据的时候选择UTF-8
四、JSP相关乱码解决⽅案(部分已经在上⾯介绍了)
问题描述:通过jsp,html,或servlet中的表单元素把参数提交给对应的jsp或者servlet时,在接收的jsp或servlet中接收到的参数中⽂显⽰乱码。
例如:
提交jsp代码如下:
<%@ page language="java" pageEncoding="utf-8"%>
<html>
<head>
<title>输⼊表单</title>
</head>
<body>
<form id="inputForm" name="inputForm" method="post" action="display.jsp">
⽤户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
<input type="submit" name="submit" value="提交"/>
</form>
</body>
</html>
接收参数的jsp代码如下:
<% @  page language="java" pageEncoding="utf-8"%>
<html>
<head>
<tilte>接收表单</title>
</head>
<body>
<% 在这⾥插⼊
request.setCharacterEncoding("utf-8");
%>
⽤户名:<%=Parameter("username")%><br/>
密码:<%=Parameter("password")%><br/>
release什么意思啊
</body>
</html>
解决⽅法:在接收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编码的字符⽂件。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。