Request和Response中文亂碼問題的解決方案和區分
阿新 • • 發佈:2019-01-05
首先,在剛接觸這個中文亂碼問題的時候,還是比較混亂的,因為針對request和response各自都有自己的解決方案,而且思路相似,方法也很相似,又針對get和post兩種提交方式,分兩種解決中文亂碼的方案;針對response響應,分位元組流和字元流的響應方式,所以,是兩個大的方向,四個小的方向。
一:Request物件接收中文資料
1.1Post方式接收中文
/** * 演示Post方式提交,解決中文亂碼問題 */ public class RequestDemo extends HttpServlet { protectedvoid doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 產生亂碼的原因: * post提交的資料在請求體中,request物件接收到資料之後,會將資料放入到request緩衝區,緩衝區有預設編碼:ISO-8859-1:不支援中文; * * 解決方案: * 將request緩衝區的編碼更改就行了 **/ request.setCharacterEncoding("UTF-8"); String parameter = request.getParameter("name"); System.out.println("姓名:"+parameter); }
1.2get方式提交接收中文
/** * 產生亂碼的原因: * get提交的資料在請求行url後面,在位址列其實已經進行了一次編碼(預設:ISO-8859-1:對中文不友好) * * 解決方案: * 將存入request緩衝區的資料以預設的方式接收,但以UTF-8的方式解碼*/ String name=request.getParameter("name"); String param=new String(name.getBytes("ISO-8859-1"),"UTF-8"); System.out.println("姓名:"+parameter);
二:Response響應資料的時候中文亂碼問題及解決方案
2.1使用位元組流方式響應中文
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 使用位元組流響應中文 */ //ServletOutputStream outputStream = response.getOutputStream(); //outputStream.write("中文".getBytes()); /** * 以上這種方式是否能夠避免不出現中文亂碼問題呢? * 不一定: * 中文亂碼的產生與中文轉化成位元組陣列和瀏覽器開啟方式(開啟時採用的預設字符集)有關 * * 解決方案: * 將中文轉化成陣列的字符集和瀏覽器開啟時候的字符集一致就行 */ ServletOutputStream outputStream = response.getOutputStream(); //設定瀏覽器開啟時預設的字符集 response.setHeader("Conten-Type", "text/html;charset=UTF-8"); //設定中文轉換成位元組組的字符集編碼 outputStream.write("中文大師".getBytes("UTF-8"));
2.2使用字元流的方式響應中文
/** * 字元流的方式響應中文 */ response.getWriter().print("中文大俠"); /** * 使用上述程式碼向頁面輸出中文是否會產生亂碼? * 一定亂碼 * 原因: * 字元流是有緩衝區的,response獲得字元流,response設計預設的緩衝區編碼是ISO-8859-1。 * 解決: 設定response獲得字元流緩衝區的編碼字符集(這句話體現在:response.getWriter(),詳情請看API)和 * 設定瀏覽器預設開啟時候採用的字符集一致即可。 * */ // 設定瀏覽器開啟時預設的字符集 response.setHeader("Conten-Type", "text/html;charset=UTF-8"); //設定response獲得字元流緩衝區的編碼字符集 response.setCharacterEncoding("UTF-8"); //響應到瀏覽器 response.getWriter().print("胡春春和阿珠"); //下面是一種簡化的方式(推薦記住和掌握) response.setContentType("text/html;charset=UTF-8"); response.getWriter().print("胡春春和阿珠");