Http請求時,URL中作為參數值的中文字符等會被編碼
1、處理編碼思路:
注意:[在瀏覽器上訪問時,每個空格會被轉碼為 %20 ,URLencode會將每個空格轉碼為 + ]
URLEncode的轉碼會將一些不需要轉碼的字符也進行轉碼(例如不是參數值的& : /等)
1.對於需要的參數先進行編碼。(如果是get請求可以先使用URLEncode編碼后進行URL的拼接)
2.對URL進行截取,然后統一編碼,將特殊字符編碼后替換回來(路徑中的& / : 當其作為參數值的時候需要轉碼,否
則不能被轉碼);此方法弊端:當& 和 / 作為參數值時需要被轉碼,不好處理。
2、一些常見字符被URLEncode轉碼后的值(中文字符會被轉碼為 以%E開頭,長度為9的字符串)
英文 ? 編碼后 : %3F
/ 編碼后:%2F
% 編碼后:%25
中文? 編碼后:%EF%BC%9F
單個空格 編碼后:+ (在瀏覽器上訪問時,每個空格會被轉碼為 %20 ,URLencode會將
每個空格轉碼為 +;可以轉碼后將其中的 + 用 %20替換掉 )
+ 編碼后:%2B
英文 : 編碼后:%3A
中文 : 編碼后:%EF%BC%9A
& 編碼后:%26
3、簡單的拼接demo(存在不足之處)
public static void main(String[] args) {
//被轉碼后的url
String result = "";
//需要轉碼的url
String url = "https://www.baidu.com/s?wd=語 文 ?&rsv_spt=1"
+ "&rsv_iqid=0xd13fd9040001fb1d&issp=1&f=8&rsv_bp=0"
+ "&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=2"
+ "&rsv_sug1=2&rsv_sug7=101&rsv_sug2=0&inputT=774&rsv_sug4=1367 &AAAA=1";
int index = url.indexOf("?");
result = url.substring(0,index+1);
String temp = url.substring(index+1);
try {
//URLEncode轉碼會將& : / = 等一些特殊字符轉碼,(但是這個字符 只有在作為參數值 時需要轉碼;例如url中的&具有參數連接的作用,此時就不能被轉碼)
String encode = URLEncoder.encode(temp, "utf-8");
System.out.println(encode);
encode = encode.replace("%3D", "=");
encode = encode.replace("%2F", "/");
encode = encode.replace("+", "%20");
encode = encode.replace("%26", "&");
result += encode;
System.out.println("轉碼后的url:"+result);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
編碼前地址:http://hi.baidu.com/test/?a=張三&b=_a123&c=+abc
編碼后地址:http://hi.baidu.com/test/?a=%E5%BC%A0%E4%B8%89&b=_a123&c=+abc (中文字符已被轉碼)
字符對應的值:
/ → 47 a-z → 97~122 A-Z → 65~90 : → 58 % → 37
中文字符對應的值是大於255的
char c = '我';
System.out.println((int)c) / /可以查看對應的數值
在字符編碼方面,ASCII碼為標准符號、數字、英文等進行了保留,取值范圍是0~127,還有一部分作為擴展ASCII碼128~255
當操作系統采用非ASCII編碼時(比如漢字編碼),一般用擴展ASCII碼來進行,約定用128~255范圍的編碼連續2~3甚至4個來進
行漢字編碼,(比如國標用連續兩個128~255的編碼表示1個漢字,分別是區碼和位碼的編碼;UTF-8可以用3個連續的數來表示一
個漢字),具體編碼規則要看具體定義,一般不相同的。因此,在處理字符串時,如果是有符號字符串,遇到小於0的字符,會結合
后面緊跟的字符來組成一個漢字,大於0的為標准西文字符;如果是無符號的,則可以判斷是否大於127。

