<筆記>Web中文亂碼解決方案與原理
阿新 • • 發佈:2021-06-10
在Web開發初學的時候,常常會遇到web的中文亂碼問題,非常痛苦...
當時我就在網上胡搜,就不斷複製黏貼,就搞定了,也沒搞清楚個明白。
亂碼原因的本質
Tomcat伺服器預設用ISO-8859-1進行編碼,我們寫了中文以後,ISO-8859-1編碼後,傳送給客戶端(瀏覽器),客戶端(瀏覽器)一臉懵逼用GBK的解碼規則進行解碼,結果就亂碼了...
解決方案
從難到簡,一步一步剖析後面背後的有趣過程。
解決方案1.0
Tomcat用ISO-8859進行編碼,瀏覽器用GBK解碼,我們讓其統一就可以了,第一個方法就是讓Tomcat用GBK進行編碼
程式碼實現
@WebServlet("/Test01") public class Test01 extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setCharacterEncoding("GBK");//設定編碼格式!!! final PrintWriter writer = resp.getWriter(); writer.write("你好"); } }
解決方案1讓伺服器去妥協成GBK解碼,萬一瀏覽器用UFT-8編碼豈不是很尷尬?
解決方案2.0
所以我們得告訴瀏覽器,我用的是UTF-8,還是GBK,這樣就不會出現不一致的情況,那麼如何實現呢?
HTTP協議的響應頭裡有這個規定:
這個請求頭資訊決定瀏覽器將以什麼形式、什麼編碼讀取這個檔案。
所以我們就可以呼叫setHeader(設定響應頭)的函式,來指定Content-Type的內容,同時還能指定字元流的編碼格式,這樣伺服器和客戶端都能統一。
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //resp.setCharacterEncoding("UTF-8");下面一行,就可以告訴字元流,我們的編碼格式是UTF-8,這行可以省略 resp.setHeader("Content-type","text/html;charset=UTF-8");//第一個是響應頭的名稱,第二個是值 final PrintWriter writer = resp.getWriter(); writer.write("你好!!"); }
Tomcat還封裝了一個函式,resp.setContentType(),可以直接修改ContentType,懶人就可以少寫一個引數了。
resp.setContentType("text/html;charset=UTF-8");
最終方案
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=UTF-8"); final PrintWriter writer = resp.getWriter(); writer.write("你好!!"); }