URL中的非ASCII字符

dav*_*ave 7 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 -恩里克-庇隆,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.我宁愿不必告诉客户回去并用特殊字符替换所有文件.

任何帮助表示赞赏.谢谢!

njl*_*son 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.但是因为这只适用于拉丁字符集,并且对于他们的一些角色来说是模棱两可的,所以希望并且可能正在消失.