我们最近将一个网站迁移到了一个新的服务器,并且遇到了一个奇怪的问题,其中一些文件名中带有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源复制图像网址,我会得到:
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
...
答案 0 :(得分:11)
Unicode规范化。
0xC3
0xA5
是U + 00E5 a-with-ring的UTF-8编码。
0xCC
0x8A
是U + 030A组合环的UTF-8编码。
U + 0035是写作A环的组合(正常形式C)方式;一个a
字母后跟U + 030A是分解(正常形式D)的写作方式。 å
vs å
- 它们看起来应该相同,但根据字体渲染情况可能略有不同。
现在通常情况并不重要,因为合理的文件系统会让它们保持不变。如果您保存名为[char U+00E5].txt
(å.txt
)的文件,则会在Windows和Linux下保留该文件。
[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字符。
认为不同,导致奇怪的互操作性问题。