url - URL 中的非 ASCII 字符

标签 url special-characters non-ascii-characters

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

例如,我正在测试的文件中有一个 á 。我在 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 进行开发。我宁愿不必告诉客户端返回并用特殊字符替换所有文件。

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

最佳答案

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

您从 Firefox 报告的转化,Cla%CC%81ssico , 这样做略有不同:它将 á 更改为后跟 U+0301 的组合 ACUTE ACCENT 字符。在 UTF-8 中,U+0301 使 0xCC 0x81 .

你应该选择哪种表示方式——unicode“á”或“a后跟组合重音”——取决于网络服务器需要什么来匹配正确的东西。在您的情况下,也许文件名实际上包含组合字符重音,这就是它起作用的原因(很难说)。

另一种处理非 ascii 拉丁字符的旧方法是使用 8 位拉丁字符集表示(ISO-8859-1 或类似的东西,例如 Windows-1252)并将其编码为一个字节。这将使 Clássico进入 Cl%E1ssico .但是由于这仅适用于拉丁字符集,并且对于其中的某些字符不明确,因此它有望并且可能会消失。

关于url - URL 中的非 ASCII 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17242846/

相关文章:

html - 如何安全地将用户提供的 URL 添加到我的 HTML 页面?

java - java应用程序如何重定向.do扩展名

java - java发送邮件时如何处理特殊字符?

Windows 上的 R : character encoding hell

c# - 正则表达式拉丁字符过滤器和非拉丁字符过滤器

url - 如何在 Swift 中检查 URL 的有效性?

url - IIS重写虚拟文件夹

javascript - 控制字符作为分隔符

php - 输入文本和特殊字符以及MySQL

python - 统一码错误 : URL contains non-ASCII characters (Python 2. 7)