java read write unicode / UTF-8 filenames(not contents)

时间:2013-01-05 12:01:23

标签: java macos encoding filenames

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

例如: 我列出了文件。

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

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

我使用的是MacOS 10.8.2 Java 7_10和Netbeans。

有什么想法吗?

提前谢谢你:)

2 个答案:

答案 0 :(得分:3)

这些字节是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();
    }
}

答案 1 :(得分:2)

这是旧java文件api中的一个错误(可能只是在mac上)。无论如何,它都是在新的java.nio中修复的。

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

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