在 OS X 和 Linux 上的 Java 6 中列出目录内容时,我遇到了一个奇怪的文件名编码问题:File.listFiles()
和相关的方法似乎返回的文件名与系统其余部分的编码不同。
请注意,导致我出现问题的不仅仅是这些文件名的显示。我主要对文件名与远程文件存储系统的比较感兴趣,所以我更关心名称字符串的内容,而不是用于打印输出的字符编码。
这是一个演示程序。它创建一个具有 Unicode 名称的文件,然后打印出从直接创建的文件中获得的文件名的URL 编码版本,以及列在父目录下的相同文件(您应该在空目录中运行此代码)。结果显示该File.listFiles()
方法返回的不同编码。
String fileName = "Trîcky Nåme";
File file = new File(fileName);
file.createNewFile();
System.out.println("File name: " + URLEncoder.encode(file.getName(), "UTF-8"));
// Get parent (current) dir and list file contents
File parentDir = file.getAbsoluteFile().getParentFile();
File[] children = parentDir.listFiles();
for (File child: children) {
System.out.println("Listed name: " + URLEncoder.encode(child.getName(), "UTF-8"));
}
这是我在系统上运行此测试代码时得到的结果。注意%CC
与%C3
字符表示。
OS X 雪豹:
File name: Tri%CC%82cky+Na%CC%8Ame
Listed name: Tr%C3%AEcky+N%C3%A5me
$ java -version
java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02-279-10M3065)
Java HotSpot(TM) 64-Bit Server VM (build 16.3-b01-279, mixed mode)
KUbuntu Linux(在同一 OS X 系统上的 VM 中运行):
File name: Tri%CC%82cky+Na%CC%8Ame
Listed name: Tr%C3%AEcky+N%C3%A5me
$ java -version
java version "1.6.0_18"
OpenJDK Runtime Environment (IcedTea6 1.8.1) (6b18-1.8.1-0ubuntu1)
OpenJDK Client VM (build 16.0-b13, mixed mode, sharing)
我尝试了各种技巧来让字符串达成一致,包括设置file.encoding
系统属性和各种LC_CTYPE
环境LANG
变量。没有什么帮助,我也不想诉诸这样的黑客。
与这个(有点相关?)问题不同,尽管名称很奇怪,我仍然能够从列出的文件中读取数据