URL中的Unicode字符


135

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

根据URL上的RFC禁止使用Unicode字符(请参阅此处)。必须对它们进行百分比编码以符合标准。

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

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

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

我的印象是正确的,在这里一定会遇到麻烦,因此,如果您正在为非技术受众提供服务,这还不是一个实际的解决方案,并且即使引用和传递所有链接也都能够正常工作,这一点很重要吗?

是否有一些神奇的方法可以在HTML中提供美观的URL

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

可以原样复制并粘贴特殊字符,但是在较旧的客户端中重复使用时可以正常工作吗?


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

Answers:


126

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

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


哇,实际上您是对的!如果您剪切并粘贴%编码的URL,Firefox会将其转换为正确的显示内容。
Dean Harding

哇,我没有意识到这一点。这是最好的解决方案!
Pekka '04

33
@Dean是一个相当近期的变化-在2005年,所有国际维基百科看起来都像是真正的%6D%65%73%73。
Roman Starkov 2011年

2
您现在可以在HTML5文档中使用未编码的UTF-8 URL(即IRI)。如果这样做,所有主要的浏览器都会理解它并在其地址栏中正确显示它。
奥利弗·

现代浏览器将哪些字节发送到请求行中的服务器GET /images/logo.png HTTP/1.1?他们是否总是对网址进行百分比编码?
Flimm 2015年

87

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版本,它是...

...嗯,你知道的。


31
我知道。有一天,有人不得不去一个大俱乐部,把那些Lynx开发人员打在脑袋上。感谢您提供出色的背景信息。
Pekka '04

2
@bobince还有一个不能处理非IRI URI的机器人(快进到2013年)是……嗯,你知道的:bingbot!去搞清楚。
汤姆·哈里森

1
HTML5最终支持IRI。有关此问题的更多信息可以在有关问题的答案中找到。
奥利弗·

5
回复:IE并不总是显示漂亮的IRI-它们可以保护用户免受基于同形异义词的网络钓鱼攻击。请访问w3.org/International/articles/idn-and-iri(特别是“域名和网络钓鱼”部分)和blogs.msdn.com/b/ie/archive/2006/07/31/684337.aspx
encodingoutloud 2014年

2
域名与此无关。所有浏览器均禁止使用多种字符来防止网络钓鱼。在路径或查询字符串部分中显示非ASCII字符不会产生类似的漏洞。IE根本没有去实施它。(并且Firefox也是唯一在片段部分实现了它的人。)
Tgr,2015年

16

根据您的URL方案,可以将UTF-8编码的部分设置为“不重要”。例如,如果您查看堆栈溢出URL,则它们的格式如下:

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

但是,服务器实际上并不关心是否在标识符错误之后得到零件,因此这也可以:

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

因此,如果您具有这样的布局,则可以在标识符后的部分中使用UTF-8,并且如果出现乱码也就没有关系。当然,这可能仅在某些特殊情况下才有效。


嗯,非常聪明的想法!这可能仍然是一些客户端呛上的字符无论它们位于何处字符串中,但它复制+粘贴URL,我认为这是最重要的一部分时,可以排除一切与普通错乱的问题。还没有那样看过SO的URL。谢谢!
Pekka

好吧,这仍然使“问题”一词保持未翻译状态,并且在井号#后面还有一些东西,它跟在整个URL后面,虽然非常不错!
Evgeny


6

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

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

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

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

ASCII字母数字,“!”,“ $”,“&”,“'”,“(”,“)”,“ *”,“ +”,“,”,“-”,“。”,“ /” ,“:”,“;”,“ =”,“?”,“ @”,“ _”,“〜”和代码点,范围为U + 00A0至U + D7FF,U + E000至U + FDCF ,U + FDF​​0至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,例如"你好",而不传递URL字符如空格的"a b"

相关:哪些字符会使URL无效?


但是在发出正确的HTTP请求时,必须对URL("你好""a b")进行百分比编码吗?
Utku '16

"a b"我很确定@Utku 是,因为上面的允许列表中没有空格。对于"你好",这绝对是百分比编码的更好的主意,但是我不知道这仅仅是“实现不够好”还是“标准如此”的问题。HTML标准似乎允许这些字符。但是我认为这是由HTTP标准而不是HTML指定的。参见:stackoverflow.com/questions/912811/...
西罗桑蒂利郝海东冠状病六四事件法轮功

是的,我在考虑HTTP标准,而不是HTML。
Utku

5

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

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


2
@Nasser:是的-我们在德语域中也有特殊字符-但是使用Punycode将它们编码为ASCII字符。尽管它们肯定可以在主要的浏览器中运行,但要使每个HTTP客户端库和奇特的应用程序都能够处理未编码的Unicode字符,还需要很长时间。
Pekka 2010年

@Pekka,我不确定,但据我所知,所有浏览器都必须在2010年第4季度支持Unicode URL。(我不确定)
Nasser Hadjloo 2010年

并非每个用户代理都是Web浏览器的事实使问题变得复杂。最大的例子是Google本身:它不使用常见的网络浏览器来进行爬网。许多用于API交互等的库也将如此。等等— URL实际上几乎无处不在,而不仅仅是在WWW中。现在甚至可能在您的文件系统上。
Cornelius

1

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

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


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

0

对我来说,这是正确的方法,这是可行的:

    $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


2
“链接显示正确”-除了StackOverflow markdown解析器不能按预期解释URL之外!
怀特先生,2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.