URL 中的 Unicode 字符

Unicode characters in URLs

提问人:Pekka 提问时间:4/30/2010 最后编辑:CommunityPekka 更新时间:12/30/2021 访问量:181948

问:

在 2010 年,您会在大型 Web 门户中提供包含 UTF-8 字符的 URL 吗?

根据 URL 上的 RFC,禁止使用 Unicode 字符(请参阅此处)。它们必须经过百分比编码才能符合标准。

不过,我的主要观点是提供未编码的字符,其唯一目的是拥有美观的 URL,因此百分比编码已出局。

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

  • 将 URL 复制 + 粘贴到文本文件、电子邮件,甚至是具有不同编码的网站中
  • HTTP 客户端库
  • 异国情调的浏览器,RSS阅读器

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

有没有一些神奇的方法可以在 HTML 中提供漂亮的 URL

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

可以在特殊字符完好无损的情况下复制+粘贴,但在旧客户端中重复使用时可以正常工作吗?

HTML URL Unicode UTF-8

评论

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

答:

22赞 Dean Harding 4/30/2010 #1

根据您的 URL 方案,您可以将 UTF-8 编码部分设置为“不重要”。例如,如果您查看 Stack Overflow URL,它们采用以下形式:

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

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

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

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

评论

0赞 Pekka 4/30/2010
嗯,想得很聪明!可能仍然有一些客户端在字符串中的哪个位置都会窒息字符,但它可以消除复制+粘贴 URL 时普通乱码的所有问题,我认为这是最重要的部分。还没有以这种方式查看 SO 的 URL。谢谢!
0赞 Evgeny 5/1/2010
好吧,这仍然使单词“问题”未翻译,另外在hash #之后还有东西,它遵循整个URL,虽然非常好!
7赞 Glutexo 8/12/2016
自動翻訳機を使ってその日本語のURLを作ったね。
145赞 Tgr 4/30/2010 #2

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

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

评论

0赞 Dean Harding 4/30/2010
哇,其实你是对的!如果你剪切粘贴一个 % 编码的 URL,Firefox 会把它变成正确的显示方式。
0赞 Pekka 4/30/2010
哇,我没有意识到这一点。这很可能是最好的解决方案!
42赞 Roman Starkov 1/9/2011
@Dean这是一个相当新的变化 - 在2005年,所有国际维基百科看起来都像一个真正的%6D%65%73%73。
2赞 Oliver 10/23/2013
您现在可以在 HTML5 文档中使用未编码的 UTF-8 URL,即 IRI。如果你这样做,所有主要的浏览器都会理解它,并在他们的地址栏中正确显示它。
0赞 Flimm 9/12/2015
现代浏览器在请求行中向服务器发送哪些字节?他们是否总是对 URL 进行百分比编码?GET /images/logo.png HTTP/1.1
99赞 bobince 4/30/2010 #3

Tgr说了什么。背景:

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

这不是 URI。但它是一个 IRI

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

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

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

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

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

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

一个浏览器的行为是不可预测的,并不总是显示漂亮的IRI版本是......

...嗯,你知道的。

评论

38赞 Pekka 4/30/2010
我知道。总有一天,有人不得不拿着一根大棍子,砸那些Lynx开发人员的头。感谢您提供出色的背景信息。
2赞 Tom Harrison 5/29/2013
@bobince 还有一个机器人(快进到 2013 年)也无法处理非 IRI URI 是......嗯,你知道:Bingbot!去想想。
1赞 Oliver 10/25/2013
HTML5 终于支持 IRI。有关该主题的更多信息,请参阅相关问题的答案
5赞 codingoutloud 2/15/2014
回复:IE 并不总是显示漂亮的 IRI——它们正在保护用户免受基于同形异义词的网络钓鱼攻击。查看 w3.org/International/articles/idn-and-iri(特别是“域名和网络钓鱼”部分)并 blogs.msdn.com/b/ie/archive/2006/07/31/684337.aspx
3赞 Tgr 7/4/2015
域名与此无关。所有浏览器都不允许使用各种字符以防止网络钓鱼。在路径或查询字符串部分中显示非 ASCII 字符不会创建类似的可识别性。IE根本没有费心去实现它。(Firefox是唯一一个为片段部分实现它的人。
6赞 Nasser Hadjloo 5/3/2010 #4

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

因此,此问题将尽快解决。

评论

2赞 Pekka 5/3/2010
@Nasser:没错 - 我们现在在德语域中也有特殊字符 - 但这些字符是使用 Punycode 编码成 ASCII 字符的。虽然它们肯定会在主要浏览器中工作,但每个 HTTP 客户端库和外来应用程序都能够处理未编码的 Unicode 字符还需要很长时间。
0赞 Nasser Hadjloo 5/3/2010
@Pekka,我不确定,但正如我听说的那样,所有浏览器都必须在 2010 年第 4 季度支持 Unicode URL。(我不确定)
0赞 Cornelius 1/23/2014
由于并非每个用户代理都是 Web 浏览器,因此问题变得复杂。最大的例子是谷歌本身:它不使用常见的网络浏览器来抓取。许多用于 API 交互的库也是如此,等等——URL 几乎无处不在,而不仅仅是在 WWW 中。甚至可能现在在您的文件系统上。
0赞 MDickten 6/20/2022
哇。我们现在已经到了 2022 年,在处理带有非 ASCII 符号的 URL 时仍然存在很多问题。例如,Ruby 仍然不支持它们,指出出于纯粹的实际原因,没有人再遵守 RFC。我只需要编写自己的函数来处理它。
8赞 Ciro Santilli OurBigBook.com 8/29/2014 #5

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

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

和 area 元素的 href 属性必须具有一个值,该值是可能被空格括起来的有效 URL。

然后“有效 URL”的定义指向 http://url.spec.whatwg.org/,它将 URL 代码点定义为:

ASCII 字母数字、“!”、“$”、“&”、“”“、”“、”(“、”)“、”*“、”+“、”“、”-“、”.“、”/“、”、 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。

The term "URL code points" is then used in a few parts of the parsing algorithm, e.g. for the relative path state:

If c is not a URL code point and not "%", parse error.

Also the validator http://validator.w3.org/ passes for URLs like , and does not pass for URLs with characters like spaces "你好""a b"

Related: Which characters make a URL invalid?

评论

0赞 Utku 8/8/2016
But both URLs ( and ) have to be percent encoded when making the HTTP request right?"你好""a b"
0赞 Ciro Santilli OurBigBook.com 8/8/2016
@Utku for I'm pretty sure yes since space is not in the allowed list above. For , it is definitely the better idea to percent encode, but I don't know if it is just a question of "the implementations are not good enough" or the "standard says so". The HTML standard seems to allows those characters. But I think this is specified by the HTTP standard, not HTML. See also: stackoverflow.com/questions/912811/…"a b""你好"
0赞 Utku 8/8/2016
Yes, I was thinking of the HTTP standard, not HTML.
1赞 Peter Manoukian 9/3/2014 #6

For me this is the correct way, This just worked:

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

This worked, and now links are displayed properly:

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

Link found on:

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

评论

2赞 MrWhite 10/30/2015
"links are displayed properly" - except that the StackOverflow markdown parser doesn't interpret URLs as intended!
0赞 EKons 11/18/2015 #7

Use percent-encoded form. Some (mainly old) computers running Windows XP for example do not support Unicode, but rather ISO encodings. That is the reason percent-encoded URLs were invented. Also, if you give a URL printed on paper to a user, containing characters that cannot be easily typed, that user may have a hard time typing it (or just ignore it). Percent-encoded form can even be used in many of the oldest machines that ever existed (although they don't support internet of course).

There is a downside though, as percent-encoded characters are longer than the original ones, thus possibly resulting in really long URLs. But just try to ignore it, or use a URL shortener (I would recommend goo.gl in this case, which makes a 13-character long URL). Also, if you don't want to register for a Google account, try bit.ly (bit.ly makes slightly longer URLs, with the length being 14 characters).

评论

2赞 Mateus Felipe 4/16/2020
Why would I want to support obsolete computers that still uses Windows XP?