java读写unicode/UTF-8文件名(非内容)
我有一些带有日语字符的目录/文件。如果我试图读取包含(例如)一个ク 我收到一个包含�. 如果我尝试创建一个包含ク 此时会出现一个包含?的文件/目录 例如: 我把文件列在一起java读写unicode/UTF-8文件名(非内容),java,macos,encoding,filenames,Java,Macos,Encoding,Filenames,我有一些带有日语字符的目录/文件。如果我试图读取包含(例如)一个ク 我收到一个包含�. 如果我尝试创建一个包含ク 此时会出现一个包含?的文件/目录 例如: 我把文件列在一起 File file = new File("."); String[] filesAndDirs = file.list(); filesAndDirs数组现在包含此特殊字符的目录。字符串现在只包含����. 没有什么可解码的,因为对于文件名中的每个字符,即使是不同的字符,getbytes也只显示“-17-65-67”
File file = new File(".");
String[] filesAndDirs = file.list();
filesAndDirs数组现在包含此特殊字符的目录。字符串现在只包含����. 没有什么可解码的,因为对于文件名中的每个字符,即使是不同的字符,getbytes也只显示“-17-65-67”
我使用MacOS 10.8.2 Java 7_10和Netbeans
有什么想法吗
提前感谢:)这些字节是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();
}
}
try(DirectoryStream dir=Files.newDirectoryStream(path.get(“.”)){
for(路径子项:dir){
字符串文件名=child.getFileName().toString();
System.out.println(“name=“+filename”);
for(char c:filename.toCharArray()){
System.out.printf(“%04x”,(int)c);
}
System.out.println();
}
}
这是旧java文件api中的一个bug(可能只是在mac上)。无论如何,它在新的java.nio中都是固定的
我有几个文件的文件名和内容中包含unicode字符,无法使用java.io.File和相关类加载。在将所有代码转换为使用后,一切都开始工作。我将org.apache.commons.io.FileUtils(也有同样的问题)替换为
…并确保使用适当的字符集读取和写入文件内容,例如:Files.readAllLines(myPath,StandardCharsets.UTF_8)不清楚如何显示这些文件名,也不清楚是否为
String.getBytes()
提供编码(您总是应该这样做)。您应该转储文件名中每个字符的UTF-16代码点,以查看实际情况。此外,还不清楚在尝试创建文件时如何获取输入数据。getBytes
返回似乎有效的内容UTF8@Jan是的,它看起来像是有效的UT8,但是getBytes为每个字符返回“-17-65-67”。但并非文件/目录名中的所有字符都相同。似乎我丢失了操作系统和JavaVM之间的所有信息。对每个特殊字符重复“-17-65-67”。[a-zA-Z…]按预期返回。我至少希望每个字符有不同的字节。也许它对每个字符都是有效的UTF8�?像魔咒一样工作:)。现在我只需要了解如何创建具有特殊字符的文件和文件夹。非常感谢你!查看javadoc中的文件
类。它有办法做所有这些事情。