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
好比:工具
輸出亂碼的問題是程序用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解碼後的字節流發向瀏覽器;
==> 狀況一:
問題代碼如【引入】的例子
咱們這裏先來講明一下錯誤的緣由,下圖是顯示亂碼的流程圖:
解決方案流程圖:
==>狀況二:
問題代碼以下
瀏覽器輸出的結果爲: ??
緣由:"博客"首先被封裝在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編碼的字符文件。