在Linux终端中,UTF-8文件名显示未找到。

9

我在Linux(Ubuntu)终端中遇到了一些文件名带有重音符号的问题。例如:

$ ls dir/
criação.png 

因此,终端会返回该文件,说明它存在。现在让我们用这个简单的命令来查看文件是否存在:

$ [ -f criação.png ] &&  echo "File Exist" || echo "Not Exist"
Not Exist

正如您所看到的,“不存在”。现在,我在OSX上有相同的文件夹和文件,然后运行相同的命令,它返回以下结果:

$ [ -f criação.png ] &&  echo "File Exist" || echo "Not Exist"
File Exist

我了解一些关于本地化的知识:

$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8" 
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

在linux系统上,文件不存在,而在OSX系统上,文件存在。有人知道如何解决这个问题吗?
也许这些链接可以帮到你:
http://nedbatchelder.com/blog/201106/filenames_with_accents.html
http://www.ruby-forum.com/topic/279105 更新 - 解决方案 我最终找到了解决该问题的方法。你需要将文件名从NFD重命名为NFC,以下是修复所有文件的命令:
cd dir/
convmv -r -i -f utf8 -t utf8 --nfc --notest .

来源:http://blog.hbis.fr/2010/08/30/macox-utf8_filenames_normalization/

这篇文章讨论了Mac OS X对UTF-8文件名的标准化问题,以及如何在Cocoa应用程序中处理它们。通常情况下,如果您使用的是UTF-8编码并且遵循Unicode规范,则Mac OS X文件系统会自动标准化文件名。然而,某些字符序列可能会被视为等效而引起问题,因此需要进行手动标准化。Cocoa提供了一些方便的方法来处理这种情况。

我的问题也与nginx有关。例如: 2012/11/08 17:05:34 [error] 12102#0: *128 open() "/usr/share/nginx/www/wp-content/uploads/2012/09/celular-inclusão-digital.png" failed (2: No such file or directory), client: 66.249.76.145, server: site.com, request: "GET /wp-content/uploads/2012/09/celular-inclus%C3%A3o-digital.png HTTP/1.1", host: "site.com" - mateussouzaweb
1
解决方案是正确的(MacOS使用NFD,但几乎所有其他系统都使用NFC,在涉及MacOS时会导致兼容性问题),但您应该将其发布为答案。您的答案比您接受的答案更正确! - Celada
convmv -r -f iso8859-1 -t utf8 --nfc --notest . 这个命令可以修复我从Windows上传到Linux的带有重音符号的文件名。 - Jose Nobile
1个回答

1
可能的原因之一是文件名使用了与您输入名称时不同的带组合符号的Unicode规范化字符形式。请参见Unicode等价性

是的,我尝试了一些命令,然后偶然发现了一个“技巧”可行: mv criac<0327>a<0303>o.png criação.png 现在文件存在了。这与 NFC 和 NFD 有关。 - mateussouzaweb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接