(1)響應體設置文本
獲得字符流,通過字符流的write(
String s)
方法可以將字符串設置到response 緩沖區中,隨后Tomcat會將response緩沖區中的內容組裝成Http響應返回給瀏覽 器端。
關於設置中文的亂碼問題
原因:response緩沖區的默認編碼是iso8859-1,此碼表中沒有中文,可以通過 response的setCharacterEncoding(
String charset)
設置response的編碼
但我們發現客戶端還是不能正常顯示文字
原因:我們將response緩沖區的編碼設置成UTF-8,但瀏覽器的默認編碼是本地系 統的編碼,因為我們都是中文系統,所以客戶端瀏覽器的默認編碼是GBK,我們可以 手動修改瀏覽器的編碼是UTF-8。
我們還可以在代碼中指定瀏覽器解析頁面的編碼方式,
通過response的setContentType(
String type)
方法指定頁面解析時的編碼是UTF-8
response.setContentType("text/html;charset=UTF-8");
上面的代碼不僅可以指定瀏覽器解析頁面時的編碼,同時也內含 setCharacterEncoding的功能,所以在實際開發中只要編寫 response.setContentType("text/html;charset=UTF-8");就可以解決頁面輸出中文亂碼問題。
request.setCharacterEncoding("UTF-8");//將獲取的內容以UTF-8顯示----POST方式提交
request.setCharacterEncoding("UTF-8");//將獲取的內容以UTF-8顯示 POST方式提交 // 1、獲得請求方式 String method = request.getMethod(); // 2、獲得請求的資源相關內容 String URI = request.getRequestURI(); StringBuffer URL = request.getRequestURL(); String query = request.getQueryString(); String HEADER = request.getHeader("User-Agent");//取指定頭名稱 String username = request.getParameter("username");//指定請求體
//如果是get方式提交,需要先將提交內容進行"iso8859-1"編碼,再使用"UTF-8"解碼(大寫)下圖 當然一般現實中很少用get提交表單
username = new String(username.getBytes("iso8859-1"), "UTF-8");
String password = request.getParameter("password"); System.out.println(username + "...." + password); response.setContentType("text/html;charset=UTF-8");//將響應的內容以UTF-8發送 response.getWriter().write(username + "...." + password + "...." + method + "...." + URI + "...." + URL + ".." + query + ".." + HEADER);
GET方式提交原理如下圖
tomcat默認全部都是用ISO-8859-1編碼,不管你頁面用什么顯示,Tomcat最終還是會替你將所有字符轉做ISO-8859-1.那么,當在另目標頁面再用GBK翻譯時就會將本來錯的編碼翻譯成GBK的編碼,這時的文字會亂碼.
所以需要先將得到"字符"(不管是什么)都先用字節數組表示,且使用ISO-8859-1進行翻譯,得到一個在ISO-8859-1編碼環境下的字節數組.例如:AB表示成[64,65].然后再用GBK編碼這個數組,並翻譯成一個字符串.
那么我們可以得到一個編碼轉換的過程
假設:GBK碼("你")->URLencode后變成->(%3F%2F)->Tomcat自動替你轉一次ISO-8859-1->得到( 23 43 68 23 42 68 每一個符號表示為ISO-8859-1中的一個編碼)->接收頁面--->再轉一次為ISO-8859-1的Byte數組[23,43,68,23,42,68]--->用GBK再轉為可讀的文字--->(%3F%2F"---->轉為("你")
//也可以Tomcat里server.XML設置字符集直接指定
3.相關知識延伸閱讀
3.1)在URL中中文字符通常出現在以下兩個地方:
http://localhost:8080/example/中 國 name=中國
(1)Query String中的參數值,比如 keywords=中國
(2)servlet path,比如: /中 國
3.2)出現亂碼問題的原因主要是以下幾方面:
(1)瀏覽器:我們的客戶端(瀏覽器)本身並沒有遵循URI編碼的規范。
(2)Servlet服務器:Servlet服務器的沒有正確配置。
3.3)相關知識:http請求的幾個環節
瀏覽器(ie firefox)—————–>Servlet服務器 ——————–>瀏覽器顯示
<編碼> < 解碼成unicode,然后將顯示的內容編碼> <解碼>
(1)瀏覽器把URL(以及post提交的內容)經過編碼后發送給服務器。
(2)這里的Servlet服務器實際上指的是由Servlet服務器提供的servlet實現ServletRequestWrapper,
不同應用服務器的 servlet實現不同,這些servlet的實現把這些內容解碼轉換為unicode,
處理完畢后,然后再把結果(即網頁)編碼返回給瀏覽器。
(3)瀏覽器按照指定的編碼顯示該網頁。
注意:
當對字符串進行編碼和解碼的時候都涉及到字符集,通常使用的字符集為ISO8859-1、GBK、UTF-8、UNICODE。
3.4)相關知識:URL的組成及說明
域名:端口/contextPath/servletPath/pathInfo queryString
(1)contextPath是在Servlet服務器的配置文件中指定的
(a)對於weblogic:contextPath是在應用 的weblogic.xml中配置。
具體參考:https://blog.csdn.net/zhou_pp/article/details/83545602