在 2010 年,您是否会在大型门户网站中提供包含 UTF-8 字符的 URL?
根据关于 URL 的 RFC(参见 here),禁止使用 Unicode 字符。它们必须进行百分比编码才能符合标准。
不过,我的主要观点是提供未编码字符的唯一目的是为了拥有漂亮的 URL,因此百分比编码已被淘汰。
无论 RFC 怎么说,所有主流浏览器似乎都可以解析这些 URL。不过,我的总体印象是,离开 Web 浏览器的域时它会变得非常不稳定:
URL 被复制+粘贴到文本文件、电子邮件,甚至是具有不同编码的网站
HTTP 客户端库
异国情调的浏览器、RSS 阅读器
我的印象是否正确,这里会出现麻烦,因此,如果您为非技术受众服务,那么这不是一个实际的解决方案(还),即使引用和传递,您的所有链接都能正常工作很重要?
有什么神奇的方法可以在 HTML 中提供漂亮的 URL
http://www.example.com/düsseldorf?neighbourhood=Lörick
可以复制+粘贴完整的特殊字符,但在旧客户端中重新使用时可以正常工作?
使用百分比编码。现代浏览器将负责显示和粘贴问题并使其易于阅读。例如。 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。
那么“有效网址”的定义指向http://url.spec.whatwg.org/,它定义了网址代码点为:
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,但不会通过像空格 "a b"
这样的字符的 URL
相关:Which characters make a URL invalid?
"你好"
和 "a b"
)都必须进行百分比编码,对吗?
"a b"
我很确定是的,因为空间不在上面的允许列表中。对于"你好"
,百分比编码绝对是更好的主意,但我不知道这只是“实现不够好”还是“标准这么说”的问题。 HTML 标准似乎允许这些字符。但我认为这是由 HTTP 标准指定的,而不是 HTML。另请参阅:stackoverflow.com/questions/912811/…
由于所有这些评论都是真实的,您应该注意,就 ICANN 批准阿拉伯语(波斯语)和中文字符注册为域名而言,所有浏览器制造公司(Microsoft、Mozilla、Apple 等)必须在没有任何编码的情况下在 URL 中支持 Unicode,并且这些应该可以被 Google 等搜索到。
所以这个问题会尽快解决。
对我来说,这是正确的方法,这很有效:
$linker = rawurldecode("$link");
<a href="<?php echo $link;?>" target="_blank"><?php echo $linker ;?></a>
这行得通,现在链接可以正确显示:
链接在:
http://www.galeriejaninerubeiz.com/newsite/news
使用百分比编码形式。例如,一些(主要是旧的)运行 Windows XP 的计算机不支持 Unicode,而是支持 ISO 编码。这就是发明百分比编码 URL 的原因。此外,如果您将打印在纸上的 URL 提供给用户,其中包含不易输入的字符,则该用户可能很难输入(或忽略它)。百分比编码形式甚至可以用于许多曾经存在的最古老的机器(尽管它们当然不支持互联网)。
但是有一个缺点,因为百分比编码的字符比原始字符长,因此可能导致 URL 非常长。但请尝试忽略它,或使用 URL 缩短器(在这种情况下,我建议使用 goo.gl,它会生成 13 个字符长的 URL)。此外,如果您不想注册 Google 帐户,请尝试 bit.ly(bit.ly 使 URL 稍长,长度为 14 个字符)。
不定期副业成功案例分享
GET /images/logo.png HTTP/1.1
中向服务器发送哪些字节?他们总是对 URL 进行百分比编码吗?