response亂碼指的是:服務器向瀏覽器發送的數據包含中文字符,瀏覽器中顯示的是亂碼;
一、亂碼產生的原因
不管是request亂碼還是response亂碼,其實都是由於客戶端(瀏覽器)跟服務器端採用的編碼格式不一致造成的。
以request亂碼爲例:瀏覽器向服務器發送請求,因爲瀏覽器與服務器之間的通信實質上是socket流,所以要先將請求參數(字符)轉換成字節,也就是編碼過程,服務器接收到請求參數後進行解碼(字節轉字符),然後封裝到request對象中。如果客戶端的編碼與服務器端的解碼不統一,就會導致通過request獲取到的請求參數的值是亂碼。
二、亂碼分類及解決方案
(一)、response亂碼
服務器發給瀏覽器的數據默認是按照ISO-8859-1編碼,瀏覽器接收到數據後按照默認的字符集進行解碼後顯示,如果瀏覽器的默認解碼字符集不是ISO-8859-1,就出現亂碼。對於response亂碼,只需要在服務器端指定一個編碼字符集,然後通知瀏覽器按照這個字符集進行解碼就可以了。
1、response.setCharacterEncoding("utf-8”);//設置服務器端的編碼,默認是ISO-8859-1;該方法必須在response.getWriter()之前進行設置
response.setHeader("contentType", "text/html; charset=utf-8”);//通知瀏覽器服務器發送的數據格式是text/html,並要求瀏覽器使用utf-8進行解碼。
2、response.setContentType("text/html;charset=utf-8”);//等同於response.setHeader("contentType", "text/html; charset=utf-8”);
3、response.setCharacterEncoding("utf-8”);//設置服務器端的編碼爲utf-8
response.getWriter().println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>”);//要求瀏覽器使用utf-8進行解碼
可以看出,第二種方式是最簡便的,這也是我們在開發中最常使用的方式。
(二)、request亂碼
從瀏覽器發起的訪問方式有三種:在地址欄直接輸入URL訪問、點擊頁面中的超鏈接訪問、提交表單訪問。1、post方式:表單提交
post方式屬於表單提交,參數存在於請求體中,pageEncoding="GBK%> 中的charset=UTF-8的編碼方式一致。
2、get方式:超鏈接、在地址欄輸入URL
·辦法一:修改服務器端對uri參數的默認編碼
pageEncoding="GBK" %> 中的charset的值爲UTF-8,否則依舊亂碼。
pageEncoding="GBK" %> 中的charset=XXX的編碼方式一致。(可以是GBK,也可以是UTF-8)
一步到位
2、要求tomcat管理下的所有web應用都要使用utf-8編碼,即所有的jsp、html頁面都使用utf-8編碼。
比如 JSP頁面的頭信息是這樣的:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"]]>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"]]>
<title>Insert title here</title>
</head>
3、在Servlet的doGet和doPost方法中:
通過 request.setCharacterEncoding("UTF-8"); 這行代碼,
告訴服務器,使用“UTF-8”編碼字符集,對請求參數進行解碼。
這樣,應該就不會出現request和response的中文亂碼問題了。
·辦法二:回退重編
例如:
name = new String(name.getBytes("iso-8859-1"),"utf-8”);//得到正常的name值
注意:name.getBytes();如果不指定編碼,默認按照gb2312進行編碼。