7

我们最近将一个网站移到了新服务器上,并且遇到了一个奇怪的问题,即一些上传的文件名中包含 unicode 字符的图像给我们一个 404 错误。

通过 ssh/FTP,我们可以看到文件肯定在那里。

例如:

http://sjofasting.no/project/adnoy

所有图像都不起作用:

代码:

<img class='image-display' title='' src='http://sjofasting.no/wp/wp-content/uploads/2012/03/ådnøy_1_2.jpg' width='685' height='484'/>

SSH:

-rw-r--r-- 1 xxxxxxxx xxxxxxxx 836813 8 月 3 日 16:12 ådnøy_1_2.jpg

同样奇怪的是,如果您导航到该目录,您甚至可以单击图像并且它可以工作:

http://sjofasting.no/wp/wp-content/uploads/2012/03/

单击“ådnøy_1_2.jpg”,它就可以工作了。

不知何故,wordpress正在生成

http://sjofasting.no/wp/wp-content/uploads/2012/03 /ådnøy_1_2.jpg

并从直接文件夹浏览中复制正在生成

http://sjofasting.no/wp/wp-content/uploads/2012/03/a%CC%8Adn%C3%B8y_1_2.jpg

到底是怎么回事??


编辑:

如果我从 wordpress 源中复制图像 url,我会得到:

http://sjofasting.no/wp/wp-content/uploads/2011/11/Bore-Strand-Hotellg%C3%A5rd-12.jpg

从 apache 浏览器复制时,我得到:

http://sjofasting.no/wp/wp-content/uploads/2011/11/Bore-Strand-Hotellga%cc%8ard-12.jpg

造成这种差异的原因是:%C3%A5 和 %cc%8

??

4

1 回答 1

12

Unicode 规范化。

0xC3 0xA5是 U+00E5 a-with-ring 的 UTF-8 编码。

0xCC 0x8A是 U+030A 组合环的 UTF-8 编码。

U+0035 是写 a 环的组合(范式 C)方式;一个a字母后跟 U+030A 是分解(Normal Form D)的写法。åvs å - 它们看起来应该相同,尽管它们可能会因字体渲染而略有不同。

现在通常情况下,您拥有哪一个并不重要,因为明智的文件系统不会影响它们。如果你保存一个名为[char U+00E5].txt( å.txt) 的文件,它在 Windows 和 Linux 下仍然是那个名称。

另一方面,Mac 是疯狂的。文件系统更喜欢 Normal Form D,因为您传递给它的任何组合字符都会转换为分解字符。如果你将一个文件放入被调用[char U+00E5].txt并立即列出目录,你会发现你实际上有一个名为a[char U+030A].txt. 您仍然可以像在 Mac 上一样访问该文件,[char U+00E5].txt因为它会在查找之前将该输入转换为 Normal Form D,但是您无法恢复与您输入的字符序列术语相同的文件名:这是一种有损转换。

因此,如果您将文件保存在 Mac 上,然后传输到文件系统[char U+00E5].txt并在其中a[char U+030A].txt引用不同的文件,您将获得断开的链接。

更新页面以指向 URL 的 Normal Form D 版本,或从不会严重破坏 Unicode 字符的文件系统重新上传文件。

思考不同,导致奇怪的互操作性问题。

于 2012-08-30T22:23:48.790 回答