掌握 URL 编码技巧,提升 Web 开发能力(十八)

在现代 Web 开发中,URL 编码是一项基本但至关重要的技能。本文将详细介绍 URL 编码的基本原理、实现方法以及相关的技术细节,帮助你更好地理解和应用这一技术。

什么是 URL?

URL(Uniform Resource Locator,统一资源定位器)是互联网上每个资源的唯一地址。例如,https://www.example.com 就是一个典型的 URL。Web 浏览器通过 URL 从 Web 服务器请求页面,从而实现用户与互联网资源的交互。

URL 编码的重要性

URL 只能使用 ASCII 字符集进行传输。然而,许多特殊字符和非英文字符不在 ASCII 范围内,因此需要进行编码才能通过互联网正确传输。URL 编码通过将这些字符转换为 ASCII 格式的百分号编码(%XX),确保数据在传输过程中不会丢失或损坏。

URL 编码的基本规则

  • 空格:通常被编码为 %20 或 +。
  • 特殊字符:如 !、@、# 等,会被编码为相应的百分号编码。
  • 非 ASCII 字符:如中文、日文等,会被编码为多个百分号编码。

实践 URL 编码

为了更好地理解 URL 编码,我们可以通过一个简单的示例来演示其工作原理。假设你有一个表单,用户输入的内容需要通过 URL 发送到服务器。当用户点击“提交”按钮时,浏览器会对输入内容进行 URL 编码,然后发送给服务器。

示例代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">

<title>URL 编码示例</title>
</head>
<body>
    <form action="/submit" method="get">
        <label for="inputText">输入内容:</label>
        <input type="text" id="inputText" name="inputText">
        <button type="submit">提交</button>
    </form>
</body>
</html>

当你在输入框中输入 Hello World! 并点击提交按钮时,浏览器会将 URL 编码为 https://example.com/submit?inputText=Hello%20World%21

URL 编码函数

不同的编程语言提供了多种方法来进行 URL 编码。以下是几种常见语言的 URL 编码函数示例:

JavaScript

const originalString = "Hello World!";
const encodedString = encodeURI(originalString);
console.log(encodedString); // 输出: Hello%20World!

PHP

$originalString = "Hello World!";
$encodedString = rawurlencode($originalString);
echo $encodedString; // 输出: Hello%20World!

ASP

<%
Dim originalString, encodedString
originalString = "Hello World!"
encodedString = Server.URLEncode(originalString)
Response.Write(encodedString) ' 输出: Hello%20World!
%>

URL 编码参考手册

以下是一些常见字符及其对应的 URL 编码:

ASCII 字符URL-编码
空格%20
!%21
"%22
#%23
$%24
%%25
&%26
'%27
(%28
)%29
*%2A
+%2B
,%2C
-%2D
.%2E
/%2F
0%30
1%31
2%32
3%33
4%34
5%35
6%36
7%37
8%38
9%39
:%3A
;%3B
<%3C
=%3D
>%3E
?%3F
@%40
A%41
B%42
C%43
D%44
E%45
F%46
G%47
H%48
I%49
J%4A
K%4B
L%4C
M%4D
N%4E
O%4F
P%50
Q%51
R%52
S%53
T%54
U%55
V%56
W%57
X%58
Y%59
Z%5A
[%5B
\%5C
]%5D
^%5E
_%5F
%60
a%61
b%62
c%63
d%64
e%65
f%66
g%67
h%68
i%69
j%6A
k%6B
l%6C
m%6D
n%6E
o%6F
p%70
q%71
r%72
s%73
t%74
u%75
v%76
w%77
x%78
y%79
z%7A
{%7B
|%7C
}%7D
~%7E
%7F

ASCII 控制字符的 URL 编码

ASCII 控制字符最初用于控制硬件设备,但在 URL 中这些字符没有实际用途,因此需要进行编码。

| ASCII 字符 | 描述 | URL-编码 |

| --- | --- | --- | | NUL | 空字符 | %00 | | SOH | 开始标题 | %01 | | STX | 开始文本 | %02 | | ETX | 结束文本 | %03 | | EOT | 结束传输 | %04 | | ENQ | 查询 | %05 | | ACK | 应答 | %06 | | BEL | 铃声 | %07 | | BS | 退格 | %08 | | HT | 水平制表 | %09 | | LF | 换行 | %0A | | VT | 垂直制表 | %0B | | FF | 换页 | %0C | | CR | 回车 | %0D | | SO | 转出 | %0E | | SI | 转入 | %0F | | DLE | 数据链路转义 | %10 | | DC1 | 设备控制 1 | %11 | | DC2 | 设备控制 2 | %12 | | DC3 | 设备控制 3 | %13 | | DC4 | 设备控制 4 | %14 | | NAK | 否定应答 | %15 | | SYN | 同步 | %16 | | ETB | 结束传输块 | %17 | | CAN | 取消 | %18 | | EM | 结束介质 | %19 | | SUB | 替换 | %1A | | ESC | 逃逸 | %1B | | FS | 文件分隔符 | %1C | | GS | 组分隔符 | %1D | | RS | 记录分隔符 | %1E | | US | 单位分隔符 | %1F |

ISO 语言代码

在 HTML 和 XHTML 中,可以通过 lang 属性声明页面的主要语言,这有助于搜索引擎和浏览器更好地理解和处理页面内容。

HTML 示例

html &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang="en"&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset="UTF-8"&amp;gt; &amp;lt;title&amp;gt;英语页面&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;p&amp;gt;这是一个英语页面。&amp;lt;/p&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt;

XHTML 示例

html &amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt; &amp;lt;html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&amp;gt; &amp;lt;title&amp;gt;英语页面&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;p&amp;gt;这是一个英语页面。&amp;lt;/p&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt;

ISO 639-1 语言代码

ISO 639-1 标准为各种语言定义了缩略词,这些代码可以在 HTML 和 XHTML 中的 lang 和 xml:lang` 属性中使用。

语言ISO 代码
Abkhazianab
Afaraa
Afrikaansaf
Albaniansq
Amharicam
Arabicar
Aragonesean
Armenianhy
Assameseas
Aymaraay
Azerbaijaniaz
Bashkirba
Basqueeu
Bengali (Bangla)bn
Bhutanidz
Biharibh
Bislamabi
Bretonbr
Bulgarianbg
Burmesemy
Byelorussian (Belarusian)be
Cambodiankm
Catalanca
Cherokee
Chewa
Chinese (简体)zh
Chinese (繁体)zh
Corsicanco
Croatianhr
Czechcs
Danishda
Divehi
Dutchnl
Edo
Englishen
Esperantoeo
Estonianet
Faeroesefo
Farsifa
Fijifj
Finnishfi
Flemish
Frenchfr
Frisianfy
Fulfulde
Galiciangl
Gaelic (Scottish)gd
Gaelic (Manx)gv
Georgianka
Germande
Greekel
Greenlandickl
Guaranign
Gujaratigu
Haitian Creoleht
Hausaha
Hawaiian
Hebrewhe, iw
Hindihi
Hungarianhu
Ibibio
Icelandicis
Idoio
Igbo
Indonesianid, in
Interlinguaia
Interlingueie
Inuktitutiu
Inupiakik
Irishga
Italianit
Japaneseja
Javanesejv
Kannadakn
Kanuri
Kashmiriks
Kazakhkk
Kinyarwanda (Ruanda)rw
Kirghizky
Kirundi (Rundi)rn
Konkani
Koreanko
Kurdishku
Laothianlo
Latinla
Latvian (Lettish)lv
Limburgish ( Limburger)li
LingalalnLithuanianltMacedonianmkMalagasymgMalaymsMalayalamml
Maltesemt
Maorimi
Marathimr
Moldavianmo
Mongolianmn
Nauruna
Nepaline
Norwegianno
Occitanoc
Oriyaor
Oromo (Afaan Oromo)om
Papiamentu
Pashto (Pushto)ps
Polishpl
Portuguesept
Punjabipa
Quechuaqu
Rhaeto-Romancerm
Romanianro
Russianru
Sami (Lappish)
Samoansm
Sangrosg
Sanskritsa
Serbiansr
Serbo-Croatiansh
Sesothost
Setswanatn
Shonasn
Sichuan Yiii
Sindhisd
Sinhalesesi
Siswatiss
Slovaksk
Sloveniansl
Somaliso
Spanishes
Sundanesesu
Swahili (Kiswahili)sw
Swedishsv
Syriac
Tagalogtl
Tajiktg
Tamazight
Tamilta
Tatartt
Telugute
Thaith
Tibetanbo
Tigrinyati
Tongato
Tsongats
Turkishtr
Turkmentk
Twitw
Uighurug
Ukrainianuk
Urduur
Uzbekuz
Venda
Vietnamesevi
Volapükvo
Wallonwa
Welshcy
Wolofwo
Xhosaxh
Yi
Yiddishyi, ji
Yorubayo
Zuluzu

HTTP 状态码

当浏览器从 Web 服务器请求服务时,服务器会返回一个 HTTP 状态码,表示请求的结果。以下是一些常见的 HTTP 状态码及其描述:

1xx: 信息

消息描述
100 Continue服务器仅接收到部分请求,如果服务器没有拒绝该请求,客户端应该继续发送其余的请求。
101 Switching Protocols服务器转换协议:服务器将遵从客户的请求转换到另外一种协议。
103 Checkpoint用于 PUT 或者 POST 请求恢复

2xx: 成功

消息描述
200 OK请求成功。
201 Created请求成功并且服务器创建了新的资源。
202 Accepted请求已被接受,但尚未处理完成。
204 No Content服务器成功处理了请求,但没有返回任何内容。

3xx: 重定向

消息描述
301 Moved Permanently请求的资源已被永久移动到新位置。
302 Found请求的资源临时从不同的 URI 响应请求。
304 Not Modified请求的资源未被修改,客户端可以使用缓存的版本。

4xx: 客户端错误

消息描述
400 Bad Request服务器无法理解请求的格式。
401 Unauthorized请求要求用户的身份认证。
403 Forbidden服务器理解请求客户端的请求,但是拒绝执行此请求。
404 Not Found请求的资源不存在。

5xx: 服务器错误

消息描述
500 Internal Server Error服务器遇到了不知道如何处理的情况。
501 Not Implemented服务器不支持请求的功能。
502 Bad Gateway服务器作为网关或代理,从上游服务器收到了无效的响应。
503 Service Unavailable服务器目前无法使用(由于超载或停机维护)。

总结

通过本文的介绍,你应该对 URL 编码有了更深入的理解。URL 编码是确保数据在互联网上传输时保持完整性和正确性的关键机制。了解并掌握 URL 编码的方法和技术,对于 Web 开发者来说是非常重要的。希望本文对你有所帮助!