URL中的Unicode字符

时间:2010-04-30 07:07:55

标签: html url unicode utf-8

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

根据URL上的RFC禁止使用Unicode字符(请参阅here)。它们必须被编码为符合标准的百分比。

我的主要观点是服务于未编码的角色,其唯一目的是拥有漂亮的URL,因此百分比编码已经完成。

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

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

我的印象是否正确,预计会遇到麻烦,因此,如果您为非技术受众群体提供服务并且即使引用并传递了所有链接也很重要,这也不是一个切实可行的解决方案?

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

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

可以复制+粘贴特殊字符,但在旧版客户端重复使用时可以正常工作吗?

7 个答案:

答案 0 :(得分:118)

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

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

答案 1 :(得分:85)

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

......嗯,你知道。

答案 2 :(得分:14)

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

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

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

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

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

答案 3 :(得分:5)

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

例如,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 + 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/也会为"你好"等网址传递,并且不会传递包含空格"a b"等字符的网址

答案 4 :(得分:4)

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

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

答案 5 :(得分:1)

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

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

答案 6 :(得分: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