1.UTF-8国际编码,GBK中文编码。GBK包含GB2312,即若是经过GB2312编码后能够经过GBK解码,反之可能不成立;html
二、web tomcat:默认是ISO8859-1,不支持中文的java
3.java.nio.charset.Charset.defaultCharset() 得到平台默认字符编码;web
4.getBytes() 是经过平台默认字符集进行编码;数据库
在学习任何一门技术时,常常会有初学者遇到中文乱码问题,好比MySQL,是由于在安装时没有设置;而在Servlet中,也会遇到中文乱码问题;浏览器
好比:tomcat
OutputStream out = response.getOutputStream();服务器
out.write(String );框架
输出中文时可能会出现乱码;jsp
好比:工具
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解码了,所以会出现乱码;
此状况需知足两个要求:
(1)文件自己是以utf-8编辑保存的(myEclipse中在properties中鼠标右键选择utf-8)
(2)浏览器用utf-8解析:
(手动)==> 在浏览器中右键选择编码格式为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"?>
Servlet乱码分为request乱码和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解码后的字节流发向浏览器;
==> 状况一:
问题代码如【引入】的例子
咱们这里先来讲明一下错误的缘由,下图是显示乱码的流程图:
解决方案流程图:
==>状况二:
问题代码以下
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中没有“博客”的编码,所以输出“??”表示没有编码;
错误代码流程图:
而解决方案是:response.setCharacterEncoding("GB2312"); 设置response使用的码表
解决方案流程图:
错误缘由:
解决方案:
如:<a href="/webproject/display.jsp?username=张三&password=123">显示用户名和密码</a>
解决方法:问题本质是get方式传递的参数内容默认编码方式问ISO8859-1,并且使用request.setCharacterEncoding("utf-8")也没法解决问题。
法一:要解决这个问题,修改tomcat服务器的配置文件。修改tomcat目录下的conf/server.xml文件的第43行:
修改前内容:
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="150" connectionTimeout="200000"
redirecPort="8443"/>
修改后内容:
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="150" connectionTimeout="200000"
redirecPort="8443" URIEncoding="utf-8"/>
法二:String usernameString = new String(username.getBytes("ISO-8859-1"),"UTF-8"); (以下图)
法三:URL转换
安装数据的时候选择UTF-8
问题描述:经过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");
%>
用户名:<%=request.getParameter("username")%><br/>
密 码:<%=request.getParameter("password")%><br/>
</body>
</html>
解决方法:在接收post提交的参数前,使用request.setCharacterEncoding("utf-8")设定接收参数的内容格式为utf-8编码。见接收表单中的插入内容便可。固然这种乱码问题最好使用中文过滤器的方法最好。
问题描述:在使用一些类库或者框架时,为了实现页面内容国际化,须要编写对应的properties文件。而properties文件中的中文内容在显示的时候也会出现乱码。
解决方法:这个乱码问题能够经过jdk中的native2ascii工具解决。使用以下命令:
native2ascii -encoding utf-8 display.properties display_zh_CN.properties
出现乱码问题的缘由是由于java编译器只能处理Latin-1或unicode编码的字符文件。