URL 中的 Unicode 字符

在2010年,你会在一个大型门户网站提供包含 UTF-8字符的 URL 吗?

根据 URL 上的 RFC,禁止使用 Unicode 字符(参见 给你)。它们必须经过百分比编码才能符合标准。

不过,我的主要观点是,提供未编码的字符仅仅是为了拥有漂亮的 URL,所以不需要百分比编码。

不管 RFC 怎么说,所有主流浏览器似乎都能很好地解析这些 URL。不过,我的总体印象是,当离开网络浏览器领域时,它会变得非常不稳定:

  • 将 URL 复制 + 粘贴到文本文件、电子邮件、甚至使用不同编码的网站中
  • HTTP 客户端库
  • 外国浏览器,RSS 阅读器

我的印象是正确的,麻烦是预期在这里,因此它不是一个实际的解决方案(尚未) ,如果你是一个非技术的受众,这是重要的,所有你的链接工作正常,即使引用和传递?

有没有什么神奇的方法可以在 HTML 中提供漂亮的 URL

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

可以复制 + 粘贴的特殊字符完好无损,但工作正常时,重用旧客户端?

170230 次浏览

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

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

However, the server doesn't actually care if you get the part after the identifier wrong, so this also works:

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

因此,如果您有一个这样的布局,那么您可以在标识符后面的部分使用 UTF-8,如果它被混乱了,那么这并不重要。当然,这可能只在某些特殊情况下有效。

使用百分比编码。现代的浏览器会处理显示和粘贴的问题,并使其人类可读。例如 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 字符,例如。它们使用 软码进行编码。

现在您有了一个 URI。这是个丑陋的 URI。但是大多数浏览器会为你隐藏这一点: 复制并粘贴到地址栏或者在链接中跟随它,你会看到它显示为原始的 Unicode 字符。维基百科已经使用这个词很多年了,例如:

http://en.wikipedia.org/wiki/ɸ

有一种浏览器的行为是不可预测的,并不总是显示美丽的 IRI 版本是..。

你知道的。

由于所有这些评论都是真实的,你应该注意到,只要 ICANN批准阿拉伯语(波斯语)和中文字符注册为域名,所有的浏览器制造公司(微软、 Mozilla、苹果等)都必须支持无任何编码的 URL 中的 Unicode,这些应该可以被谷歌搜索,等等。

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

不确定这是否是一个好主意,但是正如其他评论中提到的,正如我解释的那样,许多 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 + 00 A0到 U + D7FF,U + E000到 U + FDCF,U + FDF0到 U + FFFD,U + 10000到 U + 1 FFFD,U + 20000到 U + 2 FFFD,U + 30000到 U + 3 FFFD,U + 40000到 U + 4 FFFD 范围内的代码点,U + 50000到 U + 5 FFFD,U + 60000到 U + 6 FFFD,U + 70000到 U + 7 FFFD,U + 80000到 U + 8 FFFD,U + 90000到 U + 9 FFFD,U + A0000到 U + AFFD,U + B 0000到 U + BFFFD,U + C 0000到 U + CFFFD,U + D 0000到 U + DFFFD,U + E 1000到 U + EFFD,U + F 0000到 U + FFFD,U + 100000到 U + 10 FFFD。

术语“ URL 代码点”随后在解析算法的一些部分中使用,例如对于 相对路径状态相对路径状态:

如果 c 不是 URL 代码点,也不是“%”,则解析错误。

验证器 http://validator.w3.org/也会传递像 "你好"这样的 URL,而不会传递带有空格 "a b"这样的字符的 URL

相关阅读: 哪些字符使 URL 无效?

对我来说,这是正确的方式,这只是工作:

    $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

使用百分比编码形式 。例如,一些(主要是旧的)运行 WindowsXP 的计算机不支持 Unicode,而是支持 ISO 编码。这就是发明百分比编码 URL 的原因。另外,如果你给用户一个打印在纸上的 URL,其中包含不容易输入的字符,那么用户可能很难输入它(或者忽略它)。百分比编码形式甚至可以用在许多最古老的机器上(尽管它们当然不支持互联网)。

但是也有不利的一面,因为百分比编码的字符比原始字符长,因此可能导致 URL 非常长。但是只要试着忽略它,或者使用一个 URL 缩短程序(在这种情况下,我建议使用 很好,它使一个13个字符的长 URL)。另外,如果你不想注册一个 Google 帐户,试试 小心点(bit.ly 的 URL 稍微长一点,长度为14个字符)。