編寫此篇文章的原因:前端傳遞參數帶加號時,到后端都被轉換成了空格,對此問題比較疑惑,進行資料查找,發現編碼方面比較薄弱,進行學習記錄。
以上問題解決方法:
URLEncoder.encode("參數","utf-8");
URLDecoder.decode("參數","utf-8");
傳遞參數時進行編碼,獲取參數后進行解碼
原因:到現在還比較迷茫,知道愿意請通知一聲,謝謝
字符集與編碼方式
字符集(二進制與字符的一一映射)
ASCII (最初的字符集)
GB2312--->GBK--->GB18030(各國字符集)
-
Unicode(統一字符集)
? * 為了解決Unicode占用硬盤和流量大的問題產生了相關編碼方式
- utf-8
- utf-16
url編碼:
-
概念
參考:https://zh.wikipedia.org/wiki/%E7%99%BE%E5%88%86%E5%8F%B7%E7%BC%96%E7%A0%81
URI中允許的字符分為保留字符和非保留字符(RFC 3986中規定的保留字符和非保留字符)
? 保留字符:! * ' ( ) ; : @ & = + $ , / ? # [ ]
? 非保留字符:AZ,az,09,-_.
如果一個保留字符在特定上下文中具有特殊含義 , 且URI中必須使用該字符用于其它目的, 那么該字符必須百分號編碼.
!
#
$
&
'
(
)
*
+
,
/
:
;
=
?
@
[
]
%21
%23
%24
%26
%27
%28
%29
%2A
%2B
%2C
%2F
%3A
%3B
%3D
%3F
%40
%5B
%5D
-
使用
1.url中的PathInfo
? 實際的url路徑編碼方式由瀏覽器決定
2.url中的QueryString
? 實際的url路徑編碼方式由瀏覽器決定
3.get請求或post 請求Content-Type的值是:application/x-www-form-urlencoded
? 表單提交時,參數中中文的編碼則根據HTML代碼中指定的字符編碼來決定(也就是html代碼中<meta>標簽指定的字符編碼)。當然這是在form中沒有指定
accept-charset
的情況下,如果form中加了accept-charset="GBK”
屬性,則表單參數則由accept-charset
指定編碼進行編碼
Jsp/Servlet編碼:
-
在jsp/servlet中主要有以下幾個地方可以設置編碼
-
pageEncoding="UTF-8"
- 設置jsp編譯成servlet時使用的編碼
- 例如:jsp文件保存為gbk格式,pageEncoding="UTF-8"時servlet會出現亂碼
- JSP中不指定contentType參數,不使用response.setCharacterEncoding方法時,指定對服務器響應進行重新編碼的編碼
-
response
需要設置轉換成傳輸流的編碼方式及瀏覽器的解碼方式
服務器發給瀏覽器的數據默認是按照ISO-8859-1編碼,瀏覽器接收到數據后按照默認的字符集進行解碼后顯示,如果瀏覽器的默認解碼字符集不是ISO-8859-1,就出現亂碼。ISO-8859-1不支持中文即傳輸中文必須采用其他傳輸方式,否則為亂碼
response.setCharacterEncoding("utf-8”);
設置服務器端的編碼,默認是ISO-8859-1;該方法必須在response.getWriter()之前進行設置,如果設置了Content-Type字段,response.setCharacterEncoding方法設置的字符集編碼會出現在Http消息的響應頭中,會要求瀏覽器使用utf-8進行解碼
response.setHeader("Content-Type", "text/html; ");
或response.setHeader("Content-Type", "text/html;");
通知瀏覽器服務器發送的數據格式是text/html,并要求瀏覽器使用utf-8進行解碼。response.setContentType("text/html;charset=utf-8”);
或response.setHeader("Content-Type", "text/html; charset=utf-8”);
它其實會覆蓋response.setCharacterEncoding("utf-8”) ,在開發中只需要設置response.setContentType("text/html;charset=utf-8”)就可以了。意思是通知瀏覽器服務器發送的數據格式是text/html,服務器采用utf-8編碼,并要求瀏覽器使用utf-8進行解碼。response.setCharacterEncoding("utf-8”);
設置服務器端的編碼為utf-8
response.getWriter().println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>”);
要求瀏覽器使用utf-8進行解碼,按照整個html格式編寫,寫在head中。
可以看出,第二種方式是最簡便的,這也是我們在開發中最常使用的方式。setCharacterEncoding優先權比setContentType及setLocale()節點要高
-
request
會涉及到URL編程,參考url編碼
在服務器端,通過request.setCharacterEncoding("utf-8”)即可設置服務器的解碼為utf-8(默認是ISO-8859-1),但是它只對請求體里面的參數有效;如果參數跟在請求行中的uri后邊,它就無能為力了。因此請求方式不同,解決亂碼的方案也不同。
-
在地址欄直接輸入URL訪問
編碼方式由瀏覽器決定,RFC 3986協議強制要求轉換為UTF-8,為了方便處理,通過超鏈接和表單的訪問也規定必須是utf-8格式,即顯示當前頁面的編碼也要使用utf-8,這樣瀏覽器將統一使用utf-8對參數進行編碼
-
點擊頁面中的超鏈接訪問
將參數按照當前頁面的顯示編碼進行編碼,RFC 3986協議強制要求轉換為UTF-8。
-
提交表單訪問
將參數按照當前頁面的顯示編碼進行編碼。
解決方案:
-
post請求
post方式屬于表單提交,參數存在于請求體中,通過request.setCharacterEncoding("utf-8”)即可解決亂碼。
-
get方式
get方式提交的參數會跟在請求行中的uri后邊,服務器按照默認的iso-8859-1進行解碼,這時候解決亂碼有兩種辦法:
-
修改服務器端對uri參數的默認編碼
在tomcat的server.xml中,設置<Connector ….>元素的屬性URIEncoding="UTF-8”即可。(默認沒有設置此屬性)
注意:
1、設置<Connector ….>元素的屬性useBodyEncodingForURI=“true”,意思是請求體和uri使用相同的編碼格式。通過設置這兩個屬性,既可以解決get方式的亂碼,又可以解決 post方式的亂碼。
2、通過修改server.xml指定服務器對get和post統一按照utf-8解碼,要求tomcat管理下的所有web應用都要使用utf-8編碼,即所有的jsp、html頁面都使用utf-8編碼。比如 JSP頁面的頭信息是這樣的:
<%@ page language="java" contentType="text/html; charset=utf-8"
? pageEncoding="utf-8"%>
-
參數從瀏覽器到服務器,經過客戶端utf-8編碼,服務器端iso-8859-1解碼,最終成為亂碼。那我們將亂碼進行相反的編解碼,即可得到正常的參數值。
例如:String name = request.getParameter("name”);//得到亂碼
? name = new String(name.getBytes("iso-8859-1"),"utf-8”);//得到正常的name值
? 注意:name.getBytes();如果不指定編碼,默認按照gb2312進行編碼。
-
?
-
?
-
-