Servlet亂碼問題
- 1.常見的編碼種類
- 2.Servlet輸出過程
- 3.兩種輸出方式
- 4.浏覽器顯示采用的編碼
1.常見的編碼種類
- utf-8: 相容性最佳的編碼,開發常用
- gbk: 浏覽器預設使用的編碼
2.Servlet輸出過程
每次輸出都是指向servlet緩沖區,service()方法結束以後,将緩沖區的内容作為響應實體,再加上設定的響應頭,通過伺服器一起傳回給浏覽器,浏覽器接收後再進行顯示。
3.兩種輸出方式
-
位元組流
通過
ServletOutputStream out = response.getOutputStream();
擷取向Servlet緩沖區輸出的位元組流。由于是自己指定内容以何種編碼形式進行傳輸,是以需要手動設定所使用的編碼。
舉個例子: 比如我現在想用 utf-8 編碼輸出一句話“希望你能喜歡我的部落格”,我需要做的就是
out.write("希望你能喜歡我的部落格".getBytes("utf-8"));
,這樣傳輸到servlet緩沖區的内容 就是 utf-8 編碼的位元組流了,如果getBytes()方法不帶參數,預設是使用 gbk 進行字元編碼。
service()方法結束以後,将緩沖區的内容作為響應實體送給浏覽器,由于 已經是以位元組表示 的,是以不需要再指定使用什麼編碼進行傳輸。
-
字元流
通過
PrintWriter out=response.getWriter();
擷取向Servlet緩沖區輸出的字元流。調用print()方法,向Servlet緩沖區進行輸出。
舉個例子: 同樣的我想輸出一句話“希望你能喜歡我的部落格”,我需要做的就是
out.print("希望你能喜歡我的部落格");
那麼輸出到Servlet緩沖區的就是以字元形式表示的這句話。
但是這樣是不行的,因為字元不能直接在網絡上傳輸,service()方法結束以後,還是需要轉換成位元組流。
這個時候問題就出現了,如果不手動指定以何種形式的編碼傳輸給浏覽器,那麼Tomcat伺服器會自動使用 iso8859-1 進行傳輸,這也就造成了為什麼你設計的網頁打開都是 ?? 的原因了。
這時候我們希望用 utf-8 的編碼進行傳輸,需要自己指定
response.setCharacterEncoding("utf-8");
4.浏覽器顯示采用的編碼
通過步驟3的設定,我們浏覽器接收到了伺服器以utf-8編碼傳回的響應。由于大部分浏覽器已經删除使用者自定義采用何種編碼浏覽網頁,而且也不應該由使用者來考慮網頁編碼的選擇。是以需要開發者來設定網頁以何種編碼進行顯示。
解決的方法是響應中添加響應頭 Content-Type ,這樣浏覽器接收到這個響應時,就會以指定的編碼進行顯示。設定的語句為
response.setHeader("Content-Type", "text/html;charset=utf-8");
,這句話又等價于
response.setContentType("text/html;charset=utf-8");
至此,J2EE開發中的編碼問題就可以解決了。