我使用的File.List()与从Oracle使用Java 7时,在Mac OS X正确检索非ASCII字符的文件名有问题。
我使用下面的例子:
import java.io.*;
import java.util.*;
public class ListFiles {
public static void main(String[] args)
{
try {
File folder = new File(".");
String[] listOfFiles = folder.list();
for (int i = 0; i < listOfFiles.length; i++)
{
System.out.println(listOfFiles[i]);
}
Map<String, String> env = System.getenv();
for (String envName : env.keySet()) {
System.out.format("%s=%s%n",
envName,
env.get(envName));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行在Java 6苹果这个例子中,一切都很好:
....
Folder-ÄÖÜäöüß
吃饭.txt
....
运行在Java 7甲骨文这个例子中,结果如下:
....
Folder-A��O��U��a��o��u����
������.txt
....
但是,如果我设置环境如下(在上述两种情况下不设置):
LANG=en_US.UTF-8
不出所料与Java 7甲骨文的结果:
....
Folder-ÄÖÜäöüß
吃饭.txt
....
我的问题是,我不希望设置LANG环境变量。 这是我要部署为Mac OS X的应用程序中的GUI应用程序,并且这样做,LSEnvironment设置
<key>LSEnvironment</key>
<dict>
<key>LANG</key>
<string>en_US.UTF-8</string>
</dict>
在Info.plist的手段都不起作用时(见这里 )
我能做些什么来获取正确的Java 7中从Oracle在Mac OS X中的文件名,而不必设置LANG环境? 在Windows和Linux,这个问题不存在。
编辑:
如果我打印单个字节有:
byte[] x = listOfFiles[i].getBytes();
for (int j = 0; j < x.length; j++)
{
System.out.format("%02X",x[j]);
System.out.print(" ");
}
System.out.println();
正确的结果是:
Folder-ÄÖÜäöüß
46 6F 6C 64 65 72 2D 41 CC 88 4F CC 88 55 CC 88 61 CC 88 6F CC
88 75 CC 88 C3 9F
吃饭.txt
E5 90 83 E9 A5 AD 2E 74 78 74
而错误的结果是:
Folder-A��O��U��a��o��u����
46 6F 6C 64 65 72 2D 41 EF BF BD EF BF BD 4F EF BF BD EF BF BD
55 EF BF BD EF BF BD 61 EF BF BD EF BF BD 6F EF BF BD EF BF BD
75 EF BF BD EF BF BD EF BF BD EF BF BD
������.txt
EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD 2E 74 78 74
因此,人们可以看到,Files.list()取代一些字节用UTF-8 “EF BF BD”= Unicode的U + FFFD =替换字符,如果未设置LANG(仅爪哇7从Oracle)。