8

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

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

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

Firefox 转换以下 url 并将 á 更改为 a%CC%81 并加载图像。

http://www.themediacouncil.com/test/nonascii/LA-MAR_Cebiche-Clássico_foto-Henrique-Peron-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 进行开发。我宁愿不必告诉客户返回并用特殊字符替换所有文件。

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

4

1 回答 1

10

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

您从 Firefox 报告的转换Cla%CC%81ssico略有不同:它将 á 更改为后跟 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. 但是由于这仅适用于拉丁字符集,并且对于它们的某些字符来说是模棱两可的,因此它很有希望并且可能会消失。

于 2014-01-17T12:33:30.640 回答