ChatGPT解决这个技术问题 Extra ChatGPT

URL 中的 Unicode 字符

在 2010 年,您是否会在大型门户网站中提供包含 UTF-8 字符的 URL?

根据关于 URL 的 RFC(参见 here),禁止使用 Unicode 字符。它们必须进行百分比编码才能符合标准。

不过,我的主要观点是提供未编码字符的唯一目的是为了拥有漂亮的 URL,因此百分比编码已被淘汰。

无论 RFC 怎么说,所有主流浏览器似乎都可以解析这些 URL。不过,我的总体印象是,离开 Web 浏览器的域时它会变得非常不稳定:

URL 被复制+粘贴到文本文件、电子邮件,甚至是具有不同编码的网站

HTTP 客户端库

异国情调的浏览器、RSS 阅读器

我的印象是否正确,这里会出现麻烦,因此,如果您为非技术受众服务,那么这不是一个实际的解决方案(还),即使引用和传递,您的所有链接都能正常工作很重要?

有什么神奇的方法可以在 HTML 中提供漂亮的 URL

http://www.example.com/düsseldorf?neighbourhood=Lörick

可以复制+粘贴完整的特殊字符,但在旧客户端中重新使用时可以正常工作?

就其本身而言,Firefox 在其 URL 栏中显示 Unicode 字符,但将它们发送到经过百分比编码的服务器。此外,当用户从 URL 栏中复制 URL 时,Firefox 会确保将百分比编码的 URL 复制到剪贴板。

T
Tgr

使用百分比编码。现代浏览器将负责显示和粘贴问题并使其易于阅读。例如。 http://ko.wikipedia.org/wiki/위키백과:대문

编辑:当您在 Firefox 中复制这样的 url 时,剪贴板将保存百分比编码的形式(这通常是一件好事),但如果您只复制其中的一部分,它将保持未编码。


哇,其实你是对的!如果您剪切'n'粘贴 % 编码的 URL,Firefox 会将其转换为正确的显示内容。
哇,我没有意识到这一点。很有可能这是最好的解决方案!
@Dean 这是一个相当新的变化——在 2005 年,所有国际维基百科看起来都像一个真正的 %6D%65%73%73。
您现在可以在 HTML5 文档中使用未编码的 UTF-8 URL,即 IRIs。如果您这样做,所有主要浏览器都会理解它并在其地址栏中正确显示它。
现代浏览器在请求行 GET /images/logo.png HTTP/1.1 中向服务器发送哪些字节?他们总是对 URL 进行百分比编码吗?
b
bobince

Tgr 说的。背景:

http://www.example.com/düsseldorf?neighbourhood=Lörick

那不是URI。但它一个IRI

您不能在 HTML4 文档中包含 IRI;像 href 这样的属性类型被定义为 URI 而不是 IRI。无论如何,有些浏览器会在这里处理 IRI,但这并不是一个好主意。

要将 IRI 编码为 URI,请获取路径和查询部分,对它们进行 UTF-8 编码,然后对非 ASCII 字节进行百分比编码:

http://www.example.com/d%C3%BCsseldorf?neighbourhood=L%C3%B6rick

如果 IRI 的主机名部分中有非 ASCII 字符,例如。 http://例え.テスト/,它们已使用 Punycode 进行编码。

现在你有了一个 URI。这是一个丑陋的URI。但是大多数浏览器会为您隐藏它:将其复制并粘贴到地址栏中或在链接中跟随它,您会看到它以原始 Unicode 字符显示。维基百科多年来一直在使用它,例如:

http://en.wikipedia.org/wiki/ɸ

行为不可预测且并不总是显示漂亮的 IRI 版本的浏览器是……

……嗯,你知道的。


我知道。总有一天,有人不得不拿起一根大棍子打那些 Lynx 开发人员的头。感谢您提供出色的背景信息。
@bobince 一个也不能处理非 IRI URI 的机器人(快进到 2013 年)是……嗯,你知道:bingbot!去搞清楚。
HTML5 终于支持 IRI。可以在 this answer to a related question 中找到有关该主题的更多信息。
回复:IE 并不总是显示漂亮的 IRI - 它们保护用户免受基于同形异义词的网络钓鱼攻击。查看 w3.org/International/articles/idn-and-iri(特别是“域名和网络钓鱼”部分)和 blogs.msdn.com/b/ie/archive/2006/07/31/684337.aspx
域名与此无关。所有浏览器都不允许使用各种字符以防止网络钓鱼。在路径或查询字符串部分显示非 ASCII 字符不会产生类似的漏洞。 IE 根本懒得去实现它。 (并且 Firefox 是唯一一个在片段部分也实现了它的。)
M
Michael

根据您的 URL 方案,您可以使 UTF-8 编码部分“不重要”。例如,如果您查看 Stack Overflow URL,它们的格式如下:

http://stackoverflow.com/questions/2742852/unicode-characters-in-urls

但是,服务器实际上并不关心您是否在标识符错误之后得到了部分,因此这也有效:

http://stackoverflow.com/questions/2742852/これは、これを日本語のテキストです

因此,如果您有这样的布局,那么您可能会在标识符之后的部分中使用 UTF-8,如果它出现乱码也没关系。当然,这可能只适用于有些特殊的情况......


嗯,很聪明的想法!仍然可能有一些客户端无论字符位于字符串中的哪个位置都会卡住这些字符,但它会消除复制+粘贴 URL 时出现的所有普通乱码问题,我认为这是最重要的部分。还没有那样看 SO 的 URL。谢谢!
好吧,这仍然没有翻译“问题”这个词,而且在哈希 # 之后还有一些东西,它跟在整个 url 后面,但是非常好的技巧!
您使用自动翻译器制作了日语 URL。
C
Ciro Santilli Путлер Капут 六四事

不确定这是否是一个好主意,但正如其他评论中提到的以及我解释的那样,许多 Unicode 字符在 HTML5 URL 中是有效的。

例如,href 文档说 http://www.w3.org/TR/html5/links.html#attr-hyperlink-href

a 和 area 元素的 href 属性的值必须是一个可能被空格包围的有效 URL。

那么“有效网址”的定义指向http://url.spec.whatwg.org/,它定义了网址代码点为:

ASCII 字母数字、“!”、“$”、“&”、“'”、“(”、“)”、“*”、“+”、“”、“-”、“.”、“/” , ":", ";", "=", "?", "@", "_", "~" 和 U+00A0 到 U+D7FF, U+E000 到 U+FDCF 范围内的代码点, U+FDF0 到 U+FFFD, U+10000 到 U+1FFFD, U+20000 到 U+2FFFD, U+30000 到 U+3FFFD, U+40000 到 U+4FFFD, U+50000 到 U+5FFFD, U +60000 到 U+6FFFD,U+70000 到 U+7FFFD,U+80000 到 U+8FFFD,U+90000 到 U+9FFFD,U+A0000 到 U+AFFFD,U+B0000 到 U+BFFFD,U+C0000至 U+CFFFD,U+D0000 至 U+DFFFD,U+E1000 至 U+EFFFD,U+F0000 至 U+FFFFD,U+100000 至 U+10FFFD。

然后在解析算法的几个部分中使用术语“URL 代码点”,例如相对路径状态:

如果 c 不是 URL 代码点且不是“%”,则解析错误。

此外,验证器 http://validator.w3.org/ 会通过类似 "你好" 的 URL,但不会通过像空格 "a b" 这样的字符的 URL

相关:Which characters make a URL invalid?


但是在发出 HTTP 请求时,两个 URL("你好""a b")都必须进行百分比编码,对吗?
@Utku for "a b" 我很确定是的,因为空间不在上面的允许列表中。对于"你好",百分比编码绝对是更好的主意,但我不知道这只是“实现不够好”还是“标准这么说”的问题。 HTML 标准似乎允许这些字符。但我认为这是由 HTTP 标准指定的,而不是 HTML。另请参阅:stackoverflow.com/questions/912811/…
是的,我在考虑 HTTP 标准,而不是 HTML。
C
Cornelius

由于所有这些评论都是真实的,您应该注意,就 ICANN 批准阿拉伯语(波斯语)和中文字符注册为域名而言,所有浏览器制造公司(Microsoft、Mozilla、Apple 等)必须在没有任何编码的情况下在 URL 中支持 Unicode,并且这些应该可以被 Google 等搜索到。

所以这个问题会尽快解决。


@Nasser:是的——我们现在在德语域中也有特殊字符——但是这些是使用 Punycode 编码成 ASCII 字符的。虽然它们肯定可以在主流浏览器中工作,但每个 HTTP 客户端库和外来应用程序都需要很长时间才能处理未编码的 Unicode 字符。
@Pekka,我不确定,但据我所知,所有浏览器都必须在 2010 年第四季度支持 Unicode URL。(我不确定)
由于并非每个用户代理都是 Web 浏览器,因此问题变得更加复杂。最大的例子是谷歌本身:它不使用常见的网络浏览器来进行抓取。许多用于 API 交互等的库也是如此——URL 几乎无处不在,而不仅仅是在 WWW 中。甚至可能现在在您的文件系统上。
哇。我们现在已经 2022 年了,在处理带有非 ASCII 符号的 URL 时仍然存在很多问题。例如,Ruby 仍然不会支持它们,因为纯粹出于实际原因,没有人会再遵守 RFC。我只需要编写自己的函数来处理它。
A
Adrian

对我来说,这是正确的方法,这很有效:

    $linker = rawurldecode("$link");
    <a href="<?php echo $link;?>"   target="_blank"><?php echo $linker ;?></a>

这行得通,现在链接可以正确显示:

http://newspaper.annahar.com/article/121638-معرض--جوزف-حرب-في-غاليري-جانين-ربيز-لوحاته-الجدية-تبحث-وتكتشف-وتفرض-الاحترام

链接在:

http://www.galeriejaninerubeiz.com/newsite/news


“链接显示正确” - 除了 StackOverflow 降价解析器没有按预期解释 URL!
E
EKons

使用百分比编码形式。例如,一些(主要是旧的)运行 Windows XP 的计算机不支持 Unicode,而是支持 ISO 编码。这就是发明百分比编码 URL 的原因。此外,如果您将打印在纸上的 URL 提供给用户,其中包含不易输入的字符,则该用户可能很难输入(或忽略它)。百分比编码形式甚至可以用于许多曾经存在的最古老的机器(尽管它们当然不支持互联网)。

但是有一个缺点,因为百分比编码的字符比原始字符长,因此可能导致 URL 非常长。但请尝试忽略它,或使用 URL 缩短器(在这种情况下,我建议使用 goo.gl,它会生成 13 个字符长的 URL)。此外,如果您不想注册 Google 帐户,请尝试 bit.ly(bit.ly 使 URL 稍长,长度为 14 个字符)。


为什么我要支持仍然使用 Windows XP 的过时计算机?