天天看點

Servlet亂碼問題1.常見的編碼種類2.Servlet輸出過程3.兩種輸出方式4.浏覽器顯示采用的編碼

Servlet亂碼問題

  • 1.常見的編碼種類
  • 2.Servlet輸出過程
  • 3.兩種輸出方式
  • 4.浏覽器顯示采用的編碼

1.常見的編碼種類

  1. utf-8: 相容性最佳的編碼,開發常用
  2. gbk: 浏覽器預設使用的編碼

2.Servlet輸出過程

每次輸出都是指向servlet緩沖區,service()方法結束以後,将緩沖區的内容作為響應實體,再加上設定的響應頭,通過伺服器一起傳回給浏覽器,浏覽器接收後再進行顯示。

3.兩種輸出方式

  1. 位元組流

    通過

    ServletOutputStream out = response.getOutputStream();

    擷取向Servlet緩沖區輸出的位元組流。由于是自己指定内容以何種編碼形式進行傳輸,是以需要手動設定所使用的編碼。

    舉個例子: 比如我現在想用 utf-8 編碼輸出一句話“希望你能喜歡我的部落格”,我需要做的就是

    out.write("希望你能喜歡我的部落格".getBytes("utf-8"));

    ,這樣傳輸到servlet緩沖區的内容 就是 utf-8 編碼的位元組流了,如果getBytes()方法不帶參數,預設是使用 gbk 進行字元編碼。

    service()方法結束以後,将緩沖區的内容作為響應實體送給浏覽器,由于 已經是以位元組表示 的,是以不需要再指定使用什麼編碼進行傳輸。

  2. 字元流

    通過

    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開發中的編碼問題就可以解決了。