【问题标题】:Non-ascii characters in URLURL 中的非 ASCII 字符
【发布时间】:2013-06-19 00:48:42
【问题描述】:

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

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

感谢任何帮助。谢谢!

【问题讨论】:

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


    【解决方案1】:

    我相信正在成为标准的是将非 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 后跟重音”——取决于网络服务器匹配正确事物所需的内容。在您的情况下,文件名可能实际上包含组合字符重音,这就是它起作用的原因(很难说)。

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

    【讨论】:

    • 您是否建议在标题中声明它以便浏览器自行转换字符或某种脚本?我的设置与 OP (Wordress) 相同
    • 我不能说任何具体的设置,但总的来说,我建议 URL:s 使用与 Web 服务器相同的约定在它们出现的代码中编码(在 html 或其他格式中) .如果您对 Web 服务器使用的约定有任何影响,我建议使用 %HH 使用 UTF-8 字节序列。在标题中声明它?不确定这会产生什么影响,并且可能取决于浏览器。
    猜你喜欢
    • 2020-12-21
    • 1970-01-01
    • 2014-03-21
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2014-06-12
    相关资源
    最近更新 更多