当前位置:  开发笔记 > 编程语言 > 正文

URL中的Unicode字符

如何解决《URL中的Unicode字符》经验,为你挑选了4个好方法。

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

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

不过,我的主要观点是提供未编码的字符,其唯一目的是拥有漂亮的URL,因此百分比编码已经完成.

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

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

HTTP客户端库

异国浏览器,RSS阅读器

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

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

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

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



1> Tgr..:

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

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


@Dean这是一个相当近期的变化 - 在2005年,所有国际wikipedias看起来像一个真正的%6D%65%73%73.
您可以在[HTML5]中使用未编码的UTF-8 URL,即[IRIs](http://en.wikipedia.org/wiki/Internationalized_Resource_Identifier)(http://www.w3.org/html/wg/drafts /html/CR/infrastructure.html#urls)文件.如果您这样做,所有主流浏览器都会理解它并在其地址栏中正确显示它.

2> 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开发者.感谢您提供优质的背景信息.
回复:IE并不总是显示漂亮的IRI - 它们保护用户免受基于单应性的网络钓鱼攻击.查看http://www.w3.org/International/articles/idn-and-iri/(特别是"域名和网络钓鱼"部分)和http://blogs.msdn.com/b/ie/archive /2006/07/31/684337.aspx
@bobince和一个无法处理非IRI URI的机器人(快进到2013年)是......嗯,你知道:bingbot!去搞清楚.
域名与此无关.所有浏览器都不允许使用各种字符来防止网络钓鱼.在路径或查询字符串部分中显示非ASCII字符不会创建类似的vilnerability.IE根本没有费心去实现它.(Firefox也是唯一一个为片段部分实现它的人.)

3> Dean Harding..:

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

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

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

http://stackoverflow.com/questions/2742852/?????????????????

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


自动翻訳机を使ってその日本语のURLを作ったね.

4> Ciro Santill..:

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

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

a和area元素上的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"

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有