File.listFiles() 使用 JDK 6 修改 Unicode 名称(Unicode 规范化问题)
在OS X和Linux上列出Java 6中的目录内容时,我正在为一个奇怪的文件名编码问题而苦苦挣扎:和相关方法似乎以与系统其余部分不同的编码返回文件名。File.listFiles()
请注意,不仅仅是这些文件名的显示导致了我的问题。我主要感兴趣的是将文件名与远程文件存储系统进行比较,因此我更关心名称字符串的内容,而不是用于打印输出的字符编码。
下面是一个要演示的程序。它创建一个具有 Unicode 名称的文件,然后打印出从直接创建的 File 获取的文件名的 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 Snow Leopard:
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
与此(有点相关?)问题不同,尽管名称很奇怪,但我能够从列出的文件中读取数据