TL; DR摘要:
- 使用UTF-8到处
- URI的,百分比转义除了少数的所有字符的URL
- 允许鼓励客户使用使用UTF-8 URL表现很好的浏览器
下面是更详细的解释。你所追求的是为你的网站URL的系统,有五个属性:
- 当你的用户的浏览器的地址栏中显示的URL都清晰可辨的用户,并在用户的首选语言。
- 当用户将他们的首选语言的易读文本输入或粘贴到浏览器的位置栏中时,浏览器会形成一个URL,您的网站的HTTP服务器可以正确解释该URL。
- 当在网页中显示时,URL对用户和用户的首选语言是易读的。
- 当作为HTML链接中的链接目标提供时,会形成用户的Web浏览器可以正确发送到您网站的URL,以及您的网站的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可能是一个很好的编码选择。
我想你可以使用[babosa] [1]。将日文符号音译为拉丁语声音。只是一个想法。 [1]:https://github.com/norman/babosa – juanpastas
您能详细说明日文字符在URL中的样子吗?他们是moji烘烤? – buruzaemon
我不认为你所说的'username-slug'是一个StackOverflow意义上的单词“slug”。 SO标签'slug'的意思是“URL的描述性部分,它使人们更具描述性”。在类似于'http:// stackoverflow.com/questions/19719796/rails-need-advice'的URL中,19719796之后的部分是描述性的,但是是可选的,因此是“slug”。你有什么是URL的路径部分。我相应地扩展了问题标题和标签列表。 –