7

我有一些带有日文字符的目录/文件。如果我尝试读取包含(例如)一个 ku 的文件名(而不是内容),我会收到一个包含�的字符串。如果我尝试创建一个包含 ク 的文件/目录,则会出现一个包含 ? 的文件​​/目录。

例如:我列出了文件。

File file = new File(".");  
String[] filesAndDirs = file.list();

filesAndDirs 数组现在包含特殊字符的目录。字符串现在只包含����。它接缝没有什么要解码的,因为 getbytes 仅显示文件名中每个字符的“-17 -65 -67”,即使对于不同的字符也是如此。

我使用 MacOS 10.8.2 Java 7_10 和 Netbeans。

有任何想法吗?

先感谢您 :)

4

2 回答 2

4

这些字节是 0xef 0xbf 0xbd,这是您看到的 \ufffd 字符的 UTF-8 编码形式,而不是日文字符。看起来 Java 用来列出文件的任何操作系统函数实际上都返回了那些不正确的字符。

也许 Files.newDirectoryStream 会更可靠。试试这个:

try (DirectoryStream<Path> dir = Files.newDirectoryStream(Paths.get("."))) {
    for (Path child : dir) {
        String filename = child.getFileName().toString();

        System.out.println("name=" + filename);
        for (char c : filename.toCharArray()) {
            System.out.printf("%04x ", (int) c);
        }
        System.out.println();
    }
}
于 2013-01-05T12:41:01.443 回答
2

这是旧的 java File api 中的一个错误(可能只是在 mac 上)。无论如何,这一切都在新的 java.nio 中得到了修复。

我有几个文件在文件名和内容中包含无法使用 java.io.File 和相关类加载的 unicode 字符。在将我的所有代码转换为使用java.nio.Path之后,一切都开始工作了。我用java.nio.Files替换了 org.apache.commons.io.FileUtils (有同样的问题) ......

...并确保使用适当的字符集读取和写入文件的内容,例如: Files.readAllLines(myPath, StandardCharsets.UTF_8)

于 2014-02-24T14:13:34.273 回答