与同事一起工作时,我发现了一个奇怪的问题,似乎与编码有关。我们正在与具有足够简单的文件名,如一些图像时city.gif
或wine.gif
,但正如人们所预料的事情开始使用特殊字符,例如当更多复杂的é
,ë
,à
。我们还正在处理具有这些字符的荷兰数据,例如café
(pub)。(我们无法控制文件的来源。)这是开始出现问题的地方。以下文件名仅是示例。带有变音符号的其他字符也会出现此问题。
café-2.png
cafetaria.png
café.png
第一项和最后一项应在其中带有重音符号e(重音aigu,é
)。这样便可以在Linux(CentOS 6和7)的终端上运行它ls
。但是Windows来了!(使用Windows 10,64位。)在Windows上通过SSL与我们的服务器通过SSL连接,然后调用时ls
,上面的列表如下所示:
café-2.png
cafetaria.png
caf▒.png
如您所愿,第一行仍带有重音符号e é
,而第三行则没有。相反,我看到了▒
这个字符-它是medium shade
unicode(十进制数为1818)。这本身很奇怪。但是,当我通过SFTP和Filezilla(仍在Windows上)连接时,会看到以下内容:
café-2.png
cafetaria.png
café.png
因此,现在情况有所好转:在第一个中,é
已更改为顺序,在第三个中,一切都很好。我在这里发现,这很可能是由于Latin-1 <-> UTF-8转换出错(如果我正确的话)。但这不可能是所有发生的事情,对吧?
Linux显示了我们所期望的一切,Windows显示了似乎不一致的行为,具体取决于我们查看文件名的方式(SSH(putty)或SFTP(filezilla))。有没有一种方法可以“标准化”这些文件名(即编辑它们),并确保每个操作系统上的文件名都相同;或至少是一致的,如果是的话,如何?UTF-8
是我们选择的编码。
即使这可能只是一个美学问题,但事实并非如此。尝试从Linux服务器通过Windows中的SFTP下载内容时,我无法下载出现上述问题的文件。Filezilla将抛出诸如的错误Can't download file café-2.png: café-2.png does not exist on the server
。在我看来,Filezilla会读取目录和文件名,以某种编码对其进行解释,然后将GET请求及其解释发送给服务器,但是该解释与Linux文件名不同,因此找不到该文件。
最终,如果有解决方案,那将是很好的,尽管我也对为什么会发生这种情况感兴趣。是否因为映像文件可能是在不同的操作系统上创建而发生的?是因为Linux服务器将其解释为错误而发生,还是Windows混乱了?希望有一种解决方案,我们可以联系我们的系统管理员,要求他们打开服务器配置中的开关,但恐怕并非如此简单。
python -c "import sys; print(repr(sys.argv[1]))" café-2.png
和python -c "import sys; print(repr(sys.argv[1]))" café.png
?