1.GBK包含GB2312,即若是經過GB2312編碼後能夠經過GBK解碼,反之可能不成立; html
2.java.nio.charset.Charset.defaultCharset() 得到平臺默認字符編碼; java
3.getBytes() 是經過平臺默認字符集進行編碼; 瀏覽器
在學習任何一門技術時,常常會有初學者遇到中文亂碼問題,好比MySQL,是由於在安裝時沒有設置;而在Servlet中,也會遇到中文亂碼問題; 服務器
好比: post
OutputStream out = response.getOutputStream(); 學習
out.write(String ); ui
輸出中文時可能會出現亂碼; 編碼
好比: spa
輸出亂碼的問題是程序用UTF-8編碼,而瀏覽器用GB2312解碼,所以會出現亂碼; .net
Servlet亂碼分爲request亂碼和response亂碼;
在網上頗有效的解決方法是添加:
response.setCharacterEncoding("UTF-8");
解決不了,後來又搜到一條解決方法是:
respnse.setHeader("content-type","text/html;charset=UTF-8");
兩句都填上,後來終於解決了這個問題;
其實咱們應該思考一下本質;
咱們這裏先來講明一下錯誤的緣由,下圖是顯示亂碼的流程圖:
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使用的碼錶
<meta http-equiv="content-type" content="text/html"/> 等價於 response.setContentType("text/html");
request請求分爲post和get,對於不一樣的請求方式有不一樣的解決亂碼的方案;
錯誤緣由:
解決方案: