URI和URL是什么,以及他們的區別
- URL,
Uniform Resource Locator
,統一資源定位符。用於表示網絡上服務器的資源所在位置,比如我們輸入瀏覽器的地址。 - URI,
Uniform Resource Identifier
,統一資源標識符。它唯一標識了資源。資源的位置能從地址上標識一個資源,所以,URI一種表現形式是URL,URI還有其他表現形式,但這里不介紹。
URL的組成
URL。
一個URL的樣例:http://www.xxxxxx.com/helloween.jpg
,一個URL可以分為3部分:
- 第一部分:
http
訪問資源所使用的協議類型,常見的是HTTP、HTTPS、FTP等。 - 第二部分:資源所在的服務器地址,上述
www.xxxxxx.com
是一個域名,客戶端會通過DNS(Domain Name Server,域名服務器)得到相應的IP地址。 - 第三部分:
/helloween.jpg
是指資源在服務器的位置。
例子:
http://www.xxxxxx.com/helloween.jpg
https://www.xxxxxx.com/helloween.action?userId=123456
jdbc:mysql://localhost:3306/demo?user=root&password=123456&useUnicode=true&characterEncoding=UTF8
ftp://guest:123456@127.0.0.1
URL的編碼
為什么URL要編碼?
答:URL是表示網絡上各種資源的地址,表示網絡上各資源的地址可能是由各種各樣的字符組成,可能包含許多特殊字符,甚至一些不可打印的字符。而用URL表示這些地址,基於要適應各種協議、應用程序的要求,URL必須是通用性強,而已還必須對人們是可讀的。所以,就有了將URL編碼的方法,用一些安全的字符集合編碼表示URL,簡單來說,就是用一串安全的字符表示原先的可能包含特殊字符、不可打印字符的地址。
URL的編碼方式是怎么樣的?
答:用安全的字符表示不安全的字符。轉義后的安全字符字符為16進制數,每兩位前面加%,見以下示例:
比如&,它在ASCII表用10進制38表示,16進制26表示,所以,URL編碼后為%26。
比如“你好”,它的UTF-8編碼用16進制表示是e4bda0e5a5bd,所以,URL編碼后為%e4%bd%a0%e5%a5%bd。
比如“你好”,它的GB2312編碼用16進制表示是c4e3bac3,所以,URL編碼后為%c4%e3%ba%c3。
不知道某字符的UTF-8或GBK編碼的16進制是多少?以下的Java小程序可參考:
public class UTF8Utils {
public static void main(String[] args) throws Exception {
String s = "你好";
System.out.println(s);
System.out.println(UTF8Utils.bytesToHex(s.getBytes("UTF-8"))); // e4bda0e5a5bd
System.out.println(UTF8Utils.bytesToHex(s.getBytes("GB2312"))); // c4e3bac3
}
/**
* 字節數組轉十六進制
* @param bytes 字節數組
* @return 十六進制
*/
public static String bytesToHex(byte[] bytes) {
if (bytes == null || bytes.length == 0) {
return null;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
int r = bytes[i] & 0xFF;
String hexResult = Integer.toHexString(r);
if (hexResult.length() < 2) {
sb.append(0); // 前補0
}
sb.append(hexResult);
}
return sb.toString();
}
}
瀏覽器URL編碼所用的字符集不同的問題,及如何統一處理
我們使用常用的瀏覽器IE、Chrome、Firefox訪問URL時,不免使用到一些不安全字符,這是瀏覽器會如何處理呢?
- 有些會自動將不安全的字符編碼,有些不會。這取決於瀏覽器的機制以及你的設置。
- 有些會自動將不安全的字符通過UTF-8編碼,有些會通過GB2312編碼,甚至是其他編碼。這取決於多方面原因,如瀏覽器的機制、瀏覽器的設置、操作系統的默認編碼。
那么多方面的原因導致URL編碼結果不確定性,對我們的開發工作帶來諸多不便,比如,我們在后面設置用UTF-8解碼,有沒有辦法要求客戶端用UTF-8編碼URL呢?
答:用Javascript的encodeURL()或encodeURLComponent()吧,它們會將URL用UTF-8方法編碼。它們兩者的區別在於:
- encodeURL()一般用於整體URL的編碼的,所以URL一些保留符號(如?、&等)不被編碼。
- encodeURLComponent()一般對URL的某些組成部分編碼,所以都會編碼。