【问题标题】:java read write unicode / UTF-8 filenames (not contents)java 读写 unicode / UTF-8 文件名(不是内容)
【发布时间】:2012-12-19 17:49:49
【问题描述】:

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

例如: 我列出了文件。

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

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

我使用 MacOS 10.8.2 Java 7_10 和 Netbeans。

有什么想法吗?

提前谢谢你:)

【问题讨论】:

  • 不清楚如何显示这些文件名,或者是否提供String.getBytes() 的编码(您始终应该这样做)。您应该为文件名中的每个字符转储 UTF-16 代码点,以查看实际情况。此外,还不清楚您在尝试创建文件时如何获取输入数据。
  • getBytes 返回看似有效的 UTF8
  • @Jan 是的,它似乎是有效的 UT8,但 getBytes 为每个字符返回“-17 -65 -67”。但并非文件/目录名称中的所有字符都相同。好像我丢失了操作系统和 JavaVM 之间的所有信息。对每个特殊字符重复“-17 -65 -67”。 [a-zA-Z ...] 按预期返回。我至少希望每个字符都有不同的字节。
  • 也许它是有效的 UTF8 吗?

标签: java macos encoding filenames


【解决方案1】:

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

【讨论】:

  • 像魅力一样工作:)。现在我只需要了解如何使用特殊字符创建文件和文件夹。非常感谢!
  • 查看 Files 类的 javadoc。它有方法来做所有这些事情。
【解决方案2】:

这是旧 java File 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    相关资源
    最近更新 更多