在學習時servlet亂碼問題還是挺嚴重的,總結一下有三種情況
1.新建HTML頁面后瀏覽出現亂碼
2.以post形式請求時出現亂碼
3.以get形式請求時出現亂碼
讓我們一個一個來解決吧
1.新建HTML頁面后瀏覽出現亂碼
<!DOCTYPE html> <html> <head> <title>亂碼示例</title> <meta name="keywords" content="keyword1,keyword2,keyword3"> <meta name="description" content="this is my page"> <meta name="Content-Type"content="text/html;charset=utf-8"> </head> <body> Post示例 <br> <form action="/EnocodingDemo/GetEncodingPage" method="post"> <label>信息:</label><input type="text" name="info"><br/> <label>提交:</label> <input type="submit" value="提交"> </form> </body> </html>
我們新建一個網頁后添加一些信息,用瀏覽器打開后發現會有亂碼
遇到這種情況我們發現
代碼里已經把charset設置成了utf-8了
<meta name="Content-Type"content="text/html;charset=utf-8">
但為什么不對呢?答案是它把標記用錯了不應該用name要用http-equiv
把它修改成這樣
<meta http-equiv="Content-Type"content="text/html;charset=utf-8">
重新reload一下,用ie打開
這里要及一下基礎
name 屬性提供了名稱/值對中的名稱。HTML 和 XHTML 標簽都沒有指定任何預先定義的 <meta> 名稱。通常情況下,您可以自由使用對自己和源文檔的讀者來說富有意義的名稱。
"keywords" 是一個經常被用到的名稱。它為文檔定義了一組關鍵字。某些搜索引擎在遇到這些關鍵字時,會用這些關鍵字對文檔進行分類。
http-equiv 屬性為名稱/值對提供了名稱。並指示服務器在發送實際的文檔之前先在要傳送給瀏覽器的 MIME 文檔頭部包含名稱/值對。
當服務器向瀏覽器發送文檔時,會先發送許多名稱/值對。雖然有些服務器會發送許多這種名稱/值對,但是所有服務器都至少要發送一個:content-type:text/html。這將告訴瀏覽器准備接受一個 HTML 文檔。
它倆常用的名稱為
詳細請自己閱讀 http://www.w3school.com.cn/tags/tag_meta.asp
2.以post形式請求時出現亂碼
我們2.以post形式請求時出現亂碼就用上面的HTML頁面新建一個
新建一個servlet MyEncodingPage
POST請求的數據時作為請求體的一部分傳遞給服務器的,只要修改請求內的編碼就可以。
request.setCharacterEncoding("UTF-8");
詳細代碼
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); request.setCharacterEncoding("UTF-8"); String info = request.getParameter("info"); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.println("<h1>Hello</h1>"); out.println("info = "+info); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); }
3.以get形式請求時出現亂碼
在地址欄輸入默認是gbk,而get傳參數是要先編碼為iso8859-1再傳的,所以要先用iso-8859-1來解碼,再用utf-8編碼為一個新字符串
String str= new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8");