某些字符不能作为网址的一部分(例如,空格),而其他一些字符在网址中具有特殊含义。在 HTML 表单中,字符 =
用于将名称与值分隔开来。URI 通用语法使用网址编码来解决这一问题,而 HTML 表单则会进行一些额外的替换,而不是针对所有此类字符应用百分号编码。
例如,字符串中的空格要么使用 %20
进行编码,要么替换为加号 (+
)。如果您使用竖线字符 (|
) 作为分隔符,请务必将竖线编码为 %7C
。字符串中的逗号应编码为 %2C
。
建议您使用自己平台的常规网址构建库来自动对网址进行编码,以确保针对您的平台正确转义网址。
构建有效网址
您可能认为“有效”网址不言自明,但实际并非如此。例如,在浏览器地址栏中输入的网址可能包含特殊字符(例如 "上海+中國"
);浏览器需要先在内部将这些字符转换为其他编码,然后再进行传输。同样,任何生成或接受 UTF-8 输入的代码都可能会将包含 UTF-8 字符的网址视为“有效”,但同样需要先转换这些字符,然后再将其发送给网络服务器。该过程称为网址编码或百分号编码。
特殊字符
我们之所以需要转换特殊字符,是因为所有网址都需要符合统一资源标识符 (URI) 规范所规定的语法。实际上,这意味着网址必须只包含一个特殊的 ASCII 字符子集:熟悉的字母数字符号以及一些在网址内用作控制字符的预留字符。下表汇总了这些字符:
字符集 | 字符 | 在网址中的用法 |
---|---|---|
字母数字 | a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 | 文本字符串、协议方案用法 (http )、端口 (8080 ) 等 |
未预留 | - _ . ~ | 文本字符串 |
预留 | ! * ' ( ) ; : @ & = + $ , / ? % # [ ] | 控制字符和/或文本字符串 |
构建有效网址时,您必须确保网址只包含“有效网址字符摘要”表格中显示的那些字符。让网址按照上述字符集使用字符通常会带来两个问题,一个是遗漏问题,一个是替换问题:
- 您要处理的字符未包含在上述字符集内。例如,外语字符(例如
上海+中國
)需要使用上述字符进行编码。按照常见惯例,空格(网址内不允许使用空格)通常也使用加号字符'+'
表示。 - 字符以预留字符的形式存在于上述字符集内,但需要按原义使用。例如,
?
在网址内用于表示查询字符串的开头;如果您想要使用字符串“? and the Mysterions”,则需要对'?'
字符进行编码。
所有要进行网址编码的字符都会使用一个 '%'
字符和一个与其 UTF-8 字符对应的两个字符的十六进制值进行编码。例如,UTF-8 中的 上海+中國
在进行网址编码后将变为 %E4%B8%8A%E6%B5%B7%2B%E4%B8%AD%E5%9C%8B
。字符串 ? and the Mysterians
在进行网址编码后将变为 %3F+and+the+Mysterians
或 %3F%20and%20the%20Mysterians
。
需要编码的常见字符
以下是一些必须进行编码的常见字符:
不安全的字符 | 编码值 |
---|---|
空格 | %20 |
" | %22 |
< | %3C |
> | %3E |
# | %23 |
% | %25 |
| | %7C |
转换您通过用户输入获取的网址有时颇为棘手。例如,用户可能会输入“5th&Main St.”这样的地址。一般而言,您应该根据网址的组成部分进行构建,将所有用户输入都视为原义字符。
此外,对于所有的 Google Maps Platform 网络服务 API 或静态网络 API,网址最多可包含 8192 个字符。对于大多数服务,很少出现接近这一字符数限制的情况。但请注意,某些服务具有的若干参数可能会导致网址较长。