好的,百分比编码和解码是Web技术中一个非常基础且重要的概念。以下是相关的英文术语、核心规范和详细解释。
1. 英文术语
中文 | 英文 | 备注 |
---|---|---|
百分比编码 | Percent-Encoding | 最标准、最正式的术语 |
URL 编码 | URL Encoding | 一个常用但非官方的同义词,特指在URL上下文中的百分比编码 |
解码 | Decoding | - |
百分比解码 | Percent-Decoding | - |
转义 | Escaping | 一个更通用的术语,百分比编码是其中一种实现方式 |
取消转义 | Unescaping | - |
2. 核心规范 (RFC Standards)
百分比编码的定义和用法主要由一系列IETF的RFC(Request for Comments)文档规范。最重要的几个是:
a. RFC 3986 (Uniform Resource Identifier (URI): Generic Syntax)
这是当前定义URI(包括URL)语法的核心标准。
- 核心内容:正式定义了“百分比编码”机制。
- 格式:一个百分号
%
后跟两个十六进制数字(Hexadecimal digits)。例如,空格被编码为%20
。 - 保留字符与非保留字符:
- 保留字符 (Reserved Characters):如
:
,/
,?
,#
,[
,]
,@
,!
,$
,&
,'
,(
,)
,*
,+
,,
,;
,=
。这些字符在URI中有特殊含义,如果要在数据中使用它们的字面意思,就必须进行编码(例如,查询参数中的&
必须编码为%26
)。 - 非保留字符 (Unreserved Characters):字母(A-Z, a-z)、数字(0-9)以及字符
-
,.
,_
,~
。这些字符永远不需要编码。
- 保留字符 (Reserved Characters):如
- 未保留字符不应被编码:标准建议,为了可读性,除非必要,否则不应对未保留字符进行编码。
b. RFC 1866 (HTML 2.0) and application/x-www-form-urlencoded
虽然被后来的RFC更新,但它引入了 application/x-www-form-urlencoded
格式,这是百分比编码的另一个主要应用场景。
- 应用场景:HTTP POST请求提交表单数据时(Content-Type: application/x-www-form-urlencoded),以及URL的查询字符串(Query String)部分(
?key1=value1&key2=value2
)。 - 与RFC 3986的区别:
- 它将空格编码为加号
+
(而不是%20
)。解码时,加号必须被转换回空格。 - 这是历史遗留问题,导致在处理表单数据和纯URL路径时需要特别注意。
- 它将空格编码为加号
c. WHATWG URL Living Standard
由于Web浏览器是处理URL的主要实践者,由Web超文本应用技术工作组(WHATWG)维护的《URL Living Standard》现在被认为是Web平台事实上的标准。
- 特点:它是一个“活”的标准,会不断更新以反映浏览器的实际行为。
- 重要规定:明确要求使用UTF-8字符集对非ASCII字符进行百分比编码。这解决了早期不同系统使用不同字符集(如ISO-8859-1)导致的混乱问题。
3. 编码过程总结
- 确定字符集:现代Web标准(WHATWG)要求使用UTF-8将字符串转换为字节序列。
- 遍历字节:对字符串转换后的每个字节进行处理。
- 判断是否需要编码:
- 如果该字节对应的字符是非保留字符(如字母、数字、
-_.~
),则保持不变。 - 否则,将其转换为百分号后跟两个大写的十六进制数字的形式(例如,字节值0x20【空格】->
%20
;UTF-8下的“中”字【字节为0xE4, 0xB8, 0xAD】->%E4%B8%AD
)。
- 如果该字节对应的字符是非保留字符(如字母、数字、
- 特殊处理 (
application/x-www-form-urlencoded
): 在表单编码中,空格除了可以被编码为%20
外,还可以被替换为+
号。
Qt中的对应关系
根据之前的讨论和这些规范,就很容易理解Qt中两个函数的区别:
QUrl::fromPercentEncoding()
: 遵循的是现代URL规范(WHATWG/RFC 3986),使用UTF-8解码,并且会正确处理URL中的保留字符语义。它返回人类可读的QString
。QByteArray::fromPercentEncoding()
: 是一个更底层的工具。它默认使用Latin-1(反映了旧时代的标准),但允许你指定其他编解码器。它返回原始的QByteArray
,适合处理不一定是文本的通用百分比编码数据(如表单数据中的二进制内容)。如果需要处理表单中的+
号,你需要额外处理。
希望这个详细的解释能帮助您彻底理解这个概念!
内容由零声教学AI助手提供,问题来源于学员提问