URL中的非ASCII字符

时间:2013-06-21 19:24:06

标签: url special-characters non-ascii-characters

我遇到了一个我以前从未见过的新问题:我的客户端正在将文件添加到我们构建的项目中,并且一些文件名中包含特殊字符,因为有些字是西班牙语。

例如我正在测试的文件中有一个á。我在css文件中将该图像称为背景图像,但在Safari中它不显示。但它确实在FF和Chrome上。

作为测试,我将链接粘贴到浏览器中并且同样的事情。适用于FF和Chrome,但Safari会抛出错误。所以语言字符是我猜的吗?

Firefox转换以下网址并将á更改为%CC%81并加载图片。

http://www.themediacouncil.com/test/nonascii/LA-MAR_Cebiche - Clássico_foto-Henrique的-庇隆-470x120-1371827671.jpg

你可以看到它突破......但FF和Chrome将其转换为: http://www.themediacouncil.com/test/nonascii/LA-MAR_Cebiche-Cla%CC%81ssico_foto-Henrique-Peron-470x120-1371827671.jpg

您还可以在此处查看此操作:http://jsfiddle.net/Md4gZ/2/

.testbox { width:340px; height:100px; background:url('http://www.themediacouncil.com/test/nonascii/LA-MAR_Cebiche-Clássico_foto-Henrique-Peron-470x120-1371827671.jpg') no-repeat top left; }

最重要的是处理这个问题的正确方法。我正在开发PHP和WORDPRESS。我宁愿不必告诉客户回去并用特殊字符替换所有文件。

感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:8)

我认为成为标准的是将非ascii字符转换为UTF-8字节序列,并将这些序列包含在URL中的%HH十六进制代码中。 á字符是U + 00E1(Unicode),在UTF-8中产生两个字节0xC3 0xA1。因此,Clássico将成为Cl%C3%A1ssico

您从Firefox报告的转换Cla%CC%81ssico执行的操作略有不同:它将á更改为a后跟U + 0301,即COMBINING ACUTE ACCENT字符。在UTF-8中,U + 0301使0xCC 0x81

您应该选择哪种表示形式 - unicode“á”或“a后跟组合重音” - 取决于Web服务器匹配正确内容所需的内容。在你的情况下,也许文件名实际上包含组合字符重音,这就是它工作的原因(很难说)。

处理非ascii拉丁字符的另一种较旧的方法是使用8位拉丁字符集表示(ISO-8859-1或类似的东西,如Windows-1252)并将其编码为一个字节。这会使Clássico成为Cl%E1ssico。但是因为这只适用于拉丁字符集,并且对于他们的一些角色来说是模棱两可的,所以希望并且可能正在消失。