提问人:Pekka 提问时间:4/30/2010 最后编辑:CommunityPekka 更新时间:12/30/2021 访问量:181948
URL 中的 Unicode 字符
Unicode characters in URLs
问:
在 2010 年,您会在大型 Web 门户中提供包含 UTF-8 字符的 URL 吗?
根据 URL 上的 RFC,禁止使用 Unicode 字符(请参阅此处)。它们必须经过百分比编码才能符合标准。
不过,我的主要观点是提供未编码的字符,其唯一目的是拥有美观的 URL,因此百分比编码已出局。
无论RFC怎么说,所有主流浏览器似乎都在解析这些URL。不过,我的总体印象是,当离开 Web 浏览器领域时,它会变得非常不稳定:
- 将 URL 复制 + 粘贴到文本文件、电子邮件,甚至是具有不同编码的网站中
- HTTP 客户端库
- 异国情调的浏览器,RSS阅读器
我的印象是否正确,这里会遇到麻烦,因此,如果您为非技术受众服务,并且即使引用和传递,所有链接也能正常工作,那么它(还)不是一个实用的解决方案?
有没有一些神奇的方法可以在 HTML 中提供漂亮的 URL
http://www.example.com/düsseldorf?neighbourhood=Lörick
可以在特殊字符完好无损的情况下复制+粘贴,但在旧客户端中重复使用时可以正常工作吗?
答:
根据您的 URL 方案,您可以将 UTF-8 编码部分设置为“不重要”。例如,如果您查看 Stack Overflow URL,它们采用以下形式:
http://stackoverflow.com/questions/2742852/unicode-characters-in-urls
但是,服务器实际上并不关心您是否在标识符后面弄错了部分,因此这也有效:
http://stackoverflow.com/questions/2742852/これは、これを日本語のテキストです
因此,如果你有这样的布局,那么你可能会在标识符后面的部分使用 UTF-8,如果它被乱码也没关系。当然,这可能只适用于某些特殊情况......
评论
使用百分比编码。现代浏览器将处理显示和粘贴问题,并使其易于阅读。例如 http://ko.wikipedia.org/wiki/ 위키백과:대문
编辑:当您在Firefox中复制这样的URL时,剪贴板将保留百分比编码的形式(这通常是一件好事),但是如果您只复制其中的一部分,它将保持未编码状态。
评论
GET /images/logo.png HTTP/1.1
Tgr说了什么。背景:
http://www.example.com/düsseldorf?neighbourhood=Lörick
这不是 URI。但它是一个 IRI。
您不能在 HTML4 文档中包含 IRI;属性类型 like 定义为 URI 而不是 IRI。无论如何,一些浏览器会在这里处理 IRI,但这并不是一个好主意。href
要将 IRI 编码为 URI,请获取路径和查询部分,对它们进行 UTF-8 编码,然后对非 ASCII 字节进行百分比编码:
http://www.example.com/d%C3%BCsseldorf?neighbourhood=L%C3%B6rick
如果 IRI 的主机名部分中有非 ASCII 字符,例如。,则已使用 Punycode 对其进行编码。http://例え.テスト/
现在,你有一个 URI。这是一个丑陋的 URI。但大多数浏览器会为您隐藏它:将其复制并粘贴到地址栏中或在链接中点击它,您会看到它以原始 Unicode 字符显示。维基百科多年来一直在使用它,例如:
http://en.wikipedia.org/wiki/ɸ
一个浏览器的行为是不可预测的,并不总是显示漂亮的IRI版本是......
...嗯,你知道的。
评论
由于所有这些评论都是正确的,您应该注意,就ICANN批准将阿拉伯语(波斯语)和中文字符注册为域名而言,所有浏览器制作公司(Microsoft,Mozilla,Apple等)都必须在没有任何编码的URL中支持Unicode,并且这些应该可以被Google等搜索。
因此,此问题将尽快解决。
评论
不确定这是否是一个好主意,但正如其他评论中提到的,正如我所解释的那样,许多 Unicode 字符在 HTML5 URL 中是有效的。
例如,文档说 http://www.w3.org/TR/html5/links.html#attr-hyperlink-href:href
和 area 元素的 href 属性必须具有一个值,该值是可能被空格括起来的有效 URL。
然后“有效 URL”的定义指向 http://url.spec.whatwg.org/,它将 URL 代码点定义为:
ASCII 字母数字、“!”、“$”、“&”、“”“、”“、”(“、”)“、”*“、”+“、”“、”-“、”.“、”/“、”、 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。
The term "URL code points" is then used in a few parts of the parsing algorithm, e.g. for the relative path state:
If c is not a URL code point and not "%", parse error.
Also the validator http://validator.w3.org/ passes for URLs like , and does not pass for URLs with characters like spaces "你好"
"a b"
Related: Which characters make a URL invalid?
评论
"你好"
"a b"
"a b"
"你好"
For me this is the correct way, This just worked:
$linker = rawurldecode("$link");
<a href="<?php echo $link;?>" ><?php echo $linker ;?></a>
This worked, and now links are displayed properly:
Link found on:
http://www.galeriejaninerubeiz.com/newsite/news
评论
Use percent-encoded form. Some (mainly old) computers running Windows XP for example do not support Unicode, but rather ISO encodings. That is the reason percent-encoded URLs were invented. Also, if you give a URL printed on paper to a user, containing characters that cannot be easily typed, that user may have a hard time typing it (or just ignore it). Percent-encoded form can even be used in many of the oldest machines that ever existed (although they don't support internet of course).
There is a downside though, as percent-encoded characters are longer than the original ones, thus possibly resulting in really long URLs. But just try to ignore it, or use a URL shortener (I would recommend goo.gl in this case, which makes a 13-character long URL). Also, if you don't want to register for a Google account, try bit.ly (bit.ly makes slightly longer URLs, with the length being 14 characters).
评论