URL 编码 unicode 字符的常用方法是将其拆分为 2 个 %HH 代码。( \u4161 => %41%61 )
但是,解码时如何区分unicode?你怎么知道%41%61是\u4161与\x41\x61(“Aa”)?
需要编码的 8 位字符是否以%00 开头?
或者,unicode字符应该丢失/拆分的点是什么?
根据维基百科:
现行标准
通用 URI 语法要求提供 URI 中字符数据表示的新 URI 方案实际上必须表示来自未保留集中的字符而无需翻译,并且应该根据 UTF-8 将所有其他字符转换为字节,然后百分比编码这些值。此要求是在 2005 年 1 月随 RFC 3986 的发布而引入的。在此日期之前引入的 URI 方案不受影响。
当前规范未解决的是如何处理编码的字符数据。例如,在计算机中,字符数据在某种程度上以编码形式表现出来,因此在映射到 URI 字符时可以被视为二进制数据或字符数据。据推测,由 URI 方案规范来解释这种可能性并要求其中一种,但实际上,很少,如果有的话,实际上会这样做。
非标准实现
Unicode 字符存在一种非标准编码:%uxxxx,其中 xxxx 是表示为四个十六进制数字的 Unicode 值。此行为未由任何 RFC 指定,并且已被 W3C 拒绝。第三版 ECMA-262 仍然包括一个使用这种语法的 escape(string) 函数,还有一个 encodeURI(uri) 函数,它可以转换为 UTF-8 并对每个八位字节进行百分比编码。
所以,看起来这完全取决于编写 unencode 方法的人......标准不是很有趣吗?
我一直做的是首先 UTF-8 编码一个 Unicode 字符串,使其成为一系列 8 位字符,然后转义任何带有 %HH的字符。
PS - 我只能希望非标准实现(%uxxxx)很少而且相距甚远。
由于 URI 是在 unicode 出现之前或至少在广泛使用之前引入的,我想这是一个非常特定于实现的问题。UTF-8 对您的文本进行编码,然后按照正常情况对其进行转义听起来是最好的主意,因为这完全向后兼容任何现有的 ASCII/ANSI 系统,尽管您可能会得到一两个奇怪的奇怪字符。
另一方面,要解码,您需要对文本进行转义,并获得一个 UTF-8 字符串。如果有人使用较旧的系统尝试以 ASCII/ANSI 向您发送一些数据,这不会造成任何伤害,那(几乎)已经是 UTF-8 编码了。