在2010年,您是否会在大型门户网站中提供包含UTF-8字符的URL?
根据URL上的RFC禁止使用Unicode字符(请参阅此处).它们必须被编码为符合标准的百分比.
不过,我的主要观点是提供未编码的字符,其唯一目的是拥有漂亮的URL,因此百分比编码已经完成.
无论RFC说什么,所有主流浏览器似乎都可以解析这些URL.不过,我的总体印象是,当离开网络浏览器的域时,它会变得非常不稳定:
URL被复制+粘贴到文本文件,电子邮件,甚至是具有不同编码的网站
HTTP客户端库
异国浏览器,RSS阅读器
我的印象是否正确,预计会遇到麻烦,因此,如果您为非技术受众提供服务并且即使引用并传递了所有链接也很重要,那么这还不是一个实用的解决方案吗?
是否有一些神奇的方式在HTML中提供漂亮的URL
http://www.example.com/düsseldorf?neighbourhood=Lörick
可以复制+粘贴特殊字符,但在旧客户端重复使用时可以正常工作吗?
使用百分比编码.现代浏览器将处理显示和粘贴问题并使其易于阅读.E. g.http://ko.wikipedia.org/wiki/ 위 키 백 과 : 대 문
编辑:当您在Firefox中复制这样的URL时,剪贴板将保留百分比编码形式(这通常是一件好事),但如果您只复制其中的一部分,它将保持未编码状态.
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版本是...
......嗯,你知道.
根据您的URL方案,您可以使UTF-8编码部分"不重要".例如,如果查看Stack Overflow URL,它们的格式如下:
http://stackoverflow.com/questions/2742852/unicode-characters-in-urls
但是,服务器实际上并不关心你是否在标识符错误后得到了部分,所以这也有效:
http://stackoverflow.com/questions/2742852/?????????????????
因此,如果您有这样的布局,那么您可能会在标识符之后的部分中使用UTF-8,如果它出现乱码并不重要.当然,这可能仅适用于某些特殊情况......
不确定这是不是一个好主意,但正如其他评论中提到的那样,正如我所解释的那样,许多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 + 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 "??"
,而不会传递带有空格等字符的URL"a b"