HTTP URI 可以有非 ASCII 字符吗?

Posted

技术标签:

【中文标题】HTTP URI 可以有非 ASCII 字符吗?【英文标题】:Can HTTP URIs have non-ASCII characters? 【发布时间】:2011-01-31 01:34:44 【问题描述】:

我试图在相关的 RFC IETF RFC 3986 中找到它,但找不到。

HTTP 的 URI 是否允许 Unicode 或任何类型的非 ASCII?

您能否引用支持您的答案的部分和 RFC。

NB:对于那些可能认为这与编程无关的人来说——确实如此。它与我正在构建的 ISAPI 过滤器有关。


附录

我已阅读 RFC 3986 的第 2.5 节。但我认为是当前 HTTP 协议的 RFC 2616 早于 3986,因此我认为它不符合 3986。此外,即使或何时HTTP RFC 已更新,仍然存在合理化问题 - 换句话说,HTTP URI 是否支持所有 RFC3986 附带条件,包括适合包含非 US-ASCII 字符的任何内容?

【问题讨论】:

【参考方案1】:

RFC 3986 正在被 RFC 3987 取代,后者完全支持 Unicode,并提供与 RFC 3986 样式 URI 之间的映射规则。

【讨论】:

RFC 3987 (IRI) 不是 RFC 3986 (URI) 的替代品。最好把它想象成分层的东西。 不是分层的,而是定义在它的一边。 IRI 反映了 URI 的结构,但不是基于它。 IRI 是一个独立的方案,第 3 节现在定义在需要时在两个方案之间移动。我说它是一个替代品,因为以前依赖 URI 的许多系统已经更新为依赖 IRI。【参考方案2】:

不,他们是不允许的。只需检查 RFC 3986 中的 ABNF。

【讨论】:

以及您对另一个答案的评论:URI 不包含非 ASCII 字符。根据定义。曾经。 IRI (RFC 3987) 可以。您可以将 IRI 映射到 URI。 HTTP 仅在网络上使用 URI。【参考方案3】:

许多浏览器不支持带有 Unicode 字符的 URI(我已经在我建立的名为 blogvani.com 的网站上实现了它们)并且 Google 会适当地扫描并保持它们完好无损。不过,我认为这不适用于***域,至少不适用于注册商,也不能直接使用。

对于***域,如果您有一个以 Unicode 注册的域(例如人们可以用印地语注册域),它将被转换为相应的 ASCII 代码(可能类似于 jdhfks3243-32434.com)。 ..

看到它是如何路由的,并意识到你实际上并没有进入一个 unicode 域,尽管看起来是这样,这很有趣。

【讨论】:

【参考方案4】:

这是一个例子:☃.net。

就 RFC 3986 的相关部分而言,我认为您正在查看 2.5。

编辑:

显然堆栈溢出不会将其检测为正确的 URL。您必须复制并粘贴到浏览器中。

【讨论】:

我不清楚你的回答。是否支持带有非 US-ASCII 字符的 HTTP URI?提供一个例子不是“支持”。另外,我对 RFC3986 很清楚。我的意思是我阅读了第 2.5 节。但是我认为是当前 HTTP 协议的 RFC 2616 早于 3986,因此我认为它不能与 3986 兼容。此外,即使/当更新 HTTP RFC 时,仍然会有合理化 - 换句话说,HTTP URI 是否支持 ALL 的 RFC3986 附带条件,包括适合包含非 US-ASCII 字符的任何内容? 所以对我来说,您在此处的回复提供了信息,但不是实际的答案。另外 - 作为旁注,我无法让该 URL 工作,在任何浏览器,无论我做什么。 HTTP RFC 正在更新,它将参考 RFC 3986,请参阅 IETF HTTPbis WG 的主页。 谁支持?我可以去那个网站,所以我的浏览器和他们的 http 服务器至少支持非 ASCII 字符。【参考方案5】:

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

【讨论】:

【参考方案6】:

以前在 DNS 和 URL/URI 中不允许使用非英文字符。有一个黑客可以通过在 URI 中使用 % 编码来允许它们。然而,美国和中国等许多国家开始使用非拉丁字符实施 DNS。这是对其中之一的引用standards

【讨论】:

“非英语”→“非 ASCII”。有许多英文字符在域名中也是无效的。 所以我从中得出的结论是……标准是#1,仍在不断发展,#2,仍在被采用。换句话说,在 HTTP URI 中对非 US-ASCII 字符的支持还不稳固。准确吗? 不,这不准确。 URI 不包含非 ASCII 字符。根据定义。曾经。 IRI (RFC 3987) 可以。您可以将 IRI 映射到 URI。 HTTP 仅在网络上使用 URI。

以上是关于HTTP URI 可以有非 ASCII 字符吗?的主要内容,如果未能解决你的问题,请参考以下文章

可打印字符是啥意思?

Flutter http 0.13.0:字符串无法分配给Uri [重复]

JavaScript编码encode和decode escape和unescape

Python内置函数之ascii()

字符型变量C为啥直接可以和ASCII码比较呢?

字符编码-深入理解ASCII,GB2312,GBK,Unicode,UTF-8