为什么啊字符得到 URL 编码为 %E5%98%8A?

Why 嘊 character gets URL encoded as %E5%98%8A?

我研究了 Unicode 和 UTF-8 有一段时间了,但不完全理解 URL 编码如何处理像“啊”这样的字符。

所以,啊是 U+560A 作为 Unicode 代码,嘊 作为 HTML 十进制表示,嘊 作为 HTML 十六进制(如果我错了请纠正我)。那么为什么浏览器会 URL 编码为 %E5%98%8A?

我的猜测是啊需要超过 7 位来渲染(所以我们超出了 ASCII 范围),所以啊字符由几个字节组成(其中一个将 "shift" 到另一个代码集)和%E5%98%8A 是三个十六进制数,代表 3 个小数点 229、152、10,如果我们尝试将其转换为 UTF-8 字符集,则该小数点序列代表啊。

我说的对吗?预先感谢您的澄清!

你说啊的码位是U+560A。此代码点的 UTF-8 编码是 0xE5 0x98 0x8A,然后 % 编码到 URL.

这听起来像是混淆了 "Unicode" 和 "UTF-8" 的意思。 Unicode 是一种基本上为每个字符 (*) 分配一个数字的标准。这就是 U+560A 的含义:Unicode 代码点 560A(它只是 22026 的十六进制)。 HTML/XML 十进制和十六进制字符实体直接使用该值而无需任何编码,这就是为什么您可以只提供该数字的原因。

"Unicode" 本身还不是一种编码。这意味着它没有定义如何将这些字符映射到字节的唯一映射。

UTF-8 就是这样一种映射,它基本上试图将每个 Unicode 代码点映射到 1 到 4 个字节之间的任何位置(代码点越高,字节序列越长)。

URL编码处理具有特定编码的文本,因此它必须对UTF-8产生的字节进行编码。

(*) 它要复杂得多,它们定义的不仅仅是字符,但就此答案而言,这已经足够接近了。