- 深入理解React Router:從原理到實踐
- 李楊韜
- 917字
- 2021-04-16 16:10:33
1.1.2 瀏覽器URI編碼
1.百分號編碼
URI編碼使用的是百分號編碼(Percent-encoding)。對于需要編碼的字符,將其表示為兩個十六進(jìn)制的數(shù)字,然后在其前面放置轉(zhuǎn)義字符“%”,并替換原字符相應(yīng)位置進(jìn)行編碼。
RFC3986文檔規(guī)定,URI中只允許包含未保留字符及所有保留字符。其中,未保留字符包含英文字母(a~z,A~Z),數(shù)字(0~9),-、_、.、~4個特殊字符,共66個。對于未保留字符,不需要進(jìn)行百分號編碼。保留字符是那些具有特殊含義的字符。RFC 3986 文檔中規(guī)定了18個保留字符:

在URI中,保留字符有特殊的意義,如“?”表示查詢,“#”表示片段標(biāo)識。如果希望保留字符不表示特定的意義,僅表示一般字符,那么需要對保留字符進(jìn)行URL編碼。例如,“/”作為保留字符具有特殊意義,即作為URI的路徑分隔符,如果希望其不作為URI的路徑分隔符,僅作為一般字符,則需編碼為"%2F"或"%2f"。
2.encodeURI
encodeURI是W3C的標(biāo)準(zhǔn)(RFC 3986),不對ASCII字母和數(shù)字進(jìn)行編碼,不對20個ASCII標(biāo)點符號(-、_、.、!、~、*、'、(、)、;、/、?、:、@、&、=、+、$、,、#)進(jìn)行編碼。對于66個未保留字符,18個保留字符,除去2個不安全的保留字符“[”“]”,encodeURI的不編碼集為82個。
對于非ASCII字符,encodeURI需要將其轉(zhuǎn)換為UTF-8編碼字節(jié)序,然后在每個字節(jié)前面放置轉(zhuǎn)義字符(%)進(jìn)行百分號編碼,并置入URI中的相應(yīng)位置。

UTF-8:UTF-8具有無字節(jié)序要求、單字節(jié)特性節(jié)約內(nèi)存、向后兼容ASCII、錯誤兼容性好等優(yōu)點。一個純ASCII字符串也是一個合法的UTF-8字符串,所以現(xiàn)存的ASCII文本不需要轉(zhuǎn)換。為傳統(tǒng)的擴(kuò)展ASCII字符集設(shè)計的軟件通常可以不經(jīng)修改或經(jīng)過很少修改就能與UTF-8一起使用。
3.encodeURIComponent
encodeURIComponent假定參數(shù)是URI的一部分(比如協(xié)議、主機(jī)名、路徑或查詢字符串),因此,encodeURIComponent將轉(zhuǎn)義除字母、數(shù)字、“(”、“)”、“.”、“!”、“~”、“*”、“'”、“-”和“_”外的所有字符。例如,對“name=va&lu=”進(jìn)行encodeURIComponent編碼后結(jié)果為“"name%3Dva%26lu%3D"”。對于URL組成部分中的特殊字符,通常需要使用encodeURIComponent進(jìn)行編碼,如:

使用encodeURIComponent的好處是,如果字符串被發(fā)送到服務(wù)端進(jìn)行解析,那么服務(wù)端會把緊跟在“%”后的字節(jié)當(dāng)成普通的字節(jié),而不會把它當(dāng)成各個參數(shù)或鍵值對的分隔符。
相比encodeURIComponent,encodeURI被用作對一個完整的URI進(jìn)行編碼,而encodeURIComponent則被用作對URI的一個組件或者URI中的一個片段進(jìn)行編碼。從上面的編碼示例來看,encodeURIComponent編碼的字符范圍要比encodeURI大。
- C++ Builder 6.0下OpenGL編程技術(shù)
- Learning Elixir
- Internet of Things with the Arduino Yún
- Blender 3D Incredible Machines
- YARN Essentials
- Amazon S3 Cookbook
- C#程序設(shè)計
- Java程序設(shè)計案例教程
- Learning Material Design
- Instant Debian:Build a Web Server
- OpenCV 3.0 Computer Vision with Java
- Python第三方庫開發(fā)應(yīng)用實戰(zhàn)
- 算法超簡單:趣味游戲帶你輕松入門與實踐
- Android開發(fā)進(jìn)階實戰(zhàn):拓展與提升
- Distributed Computing with Python