1 回答
TL;DR 总结:
- 到处使用 UTF-8
- 对于 URI,百分比转义除 URL 中允许的少数字符之外的所有字符
- 鼓励您的客户使用对 UTF-8 URL 表现良好的浏览器
这是更详细的解释。您所追求的是您网站的 URL 系统,该系统具有五个属性:
- 当 URL 显示在用户浏览器的位置栏中时,这些 URL 对用户来说是清晰易读的,并且使用的是用户的首选语言。
- 当用户以他们的首选语言将清晰的文本键入或粘贴到浏览器的位置栏中时,浏览器会形成一个 URL,您的站点的 HTTP 服务器可以正确解释该 URL。
- 当在网页中显示时,这些 URL 对用户来说是易读的,并且是用户的首选语言。
- 当作为 HTML 链接中的链接目标提供时,形成一个 URL,用户的 Web 浏览器可以正确发送到您的站点,并且您的站点的 HTTP 服务器可以正确解释该 URL
- 当您站点的 HTTP 服务器接收到这些 URL 时,它会将 URL 以应用程序可以正确解释的方式传递给您的应用程序。
RFC 3986 URI Generic Syntax,第 2 节字符说,
本规范不要求对 URI 字符和用于存储或传输这些字符的八位字节之间的映射进行任何特定的字符编码......当八位字节的对应字符在外部时,使用百分比编码机制来表示组件中的数据八位字节允许的集合或被用作分隔符...
然而,所讨论的 URI 是http://
URI,因此 HTTP 规范也适用。RFC 2616 HTTP/1.1,第 3.4 节字符集,说编码(这里命名为“字符集”,与 MIME 规范一致)是使用 MIME 的字符集标签指定的。
归根结底,URI 可以采用多种编码,但您有责任确保您的网站代码和 HTTP 服务器就您将使用的编码达成一致。HTTP 协议主要将 URI 视为不透明的八位字节流。在实践中,UTF-8 是一个不错的选择。它涵盖了整个 Unicode 字符库,它是一种基于八位字节的编码,并且得到了广泛的支持。百分比编码很容易添加和删除,例如通过 Ruby 的URI::Escape方法。
让我们转到浏览器旁边。您应该了解您的用户使用哪些浏览器访问您的网站。通过粘贴带有日语路径元素的 URL 来测试这些浏览器的 URL 处理,并查看 Web 服务器向 Ruby 代码呈现的 URL。我的主浏览器 Mac OS X 上的 Firefox 16.0.2 将粘贴到其位置栏中的字符解释为 UTF-8,并在将 URL 传递给 HTTP 请求时使用该编码加上百分比转义。同样,当它遇到包含非拉丁字符的 HTTP 页面的 URL 时,它会删除 URL 的百分比编码,并将生成的八位字节视为 UTF-8 编码。如果您的用户喜欢的浏览器的行为方式相同,那么 UTF-8 URL 将以日语显示给您的用户。
您的客户是否坚持使用对百分比编码的 URL 和 UTF-8 编码的 URL 部分表现不佳的浏览器?那你就有问题了。您可能能够找出浏览器可以很好地使用的其他一些编码,例如 Shift-JIS,并让您的页面和 Web 服务器尊重该编码。或者,您可以尝试鼓励您的用户切换到支持 UTF-8 的浏览器。
接下来,让我们看看您网站的网页。您的代码可以控制网页的编码。您页面中的链接将包含链接文本(当然可以是日语)和链接目标,该链接目标必须采用您的 Web 服务器可以理解的某种编码。UTF-8 是网页编码的不错选择。
因此,您不必在任何地方都使用 UTF-8。重要的是您选择一种在您的生态系统的所有三个部分都运行良好的编码:客户的 Web 浏览器、您的 HTTP 服务器和您的网站代码。您的客户控制着这个生态系统的一部分。你控制另外两个。
用这种编码方式编码你的 URL 路径(“username-slugs”),然后对这些 URL 进行百分比转义。创作和编码您的页面以使用此编码。用户体验应该满足上述五个要求。而且我预测 UTF-8 很可能是一个不错的编码选择。