我遇到了一个我以前从未见过的新问题:我的客户端正在将文件添加到我们构建的项目中,并且一些文件名中包含特殊字符,因为有些字是西班牙语。
例如我正在测试的文件中有一个á。我在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。我宁愿不必告诉客户回去并用特殊字符替换所有文件。
感谢任何帮助。谢谢!
答案 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
。但是因为这只适用于拉丁字符集,并且对于他们的一些角色来说是模棱两可的,所以希望并且可能正在消失。