无法从文件名中读取特殊字符

3

我有一个情况,Linux挂载的NAS包括具有斯堪的纳维亚字符(如ä、ö、å)的文件名。当我使用ls列出文件时,我看到所有这些字符都显示为问号(?)。如果我运行ls -b,我将看到文件名的编码版本。像这样的字符:\ 303 \ 205

我需要从我的Java代码中读取那些文件及其文件名,但我做不到。如果我使用File.listFiles列出文件,我会得到问号而不是正确的字符。如果我将File转换为Path,我会得到异常:java.nio.file.InvalidPathException:输入格式错误或输入包含无法映射的字符
如果我在运行它时设置Dsun.jnu.encoding = UTF-8,我可以摆脱异常,但是我仍然得到ä、ö或å的问号。

我尝试了不同的设置来挂载NAS,例如check=relaxed,但没有运气。

非常感谢任何帮助。


如果“ls”不能正确显示文件名,那就已经是一件糟糕的事情了。你是否将(系统默认)编码设置为UTF-8?如果没有,Java就无法解决这个问题。(我假设NAS使用UTF-8,否则会更加复杂)。 - Bram
如果我使用Mac Cyberduck登录服务器并转到挂载,我可以看到正确的字符... - tomtom
当您执行 System.out.println( "\u00E4\u00E5\u00F6" ); 时,您会看到什么? - laune
当我运行 System.out.println("\u00E4\u00E5\u00F6"); 时,我看到的是???。 - tomtom
那么问题就在于您本地(系统默认)的编码方式。这些转义字符会产生äåö,您应该在xterm中看到它们。因此,这个问题与NAS无关。如果您执行我提出的另一个测试,输出应该显示这些十六进制数的十进制等价物。 - laune
显示剩余5条评论
1个回答

1

好的,这个问题解决了。如果我从Linux登录到运行代码的服务器上,它不会设置LC_CTYPE,但是如果我用我的MAC登录,则会将其设置为UTF-8。因此,应用程序在服务器上的运行方式取决于我用来运行它的SSH客户端....


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