File.list() 在 Mac OS X 上从 Oracle 使用 Java 7 时错误地检索带有非 ASCII 字符的文件名
我在使用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();
}
}
}
使用Apple的Java 6运行此示例,一切都很好:
....
Folder-ÄÖÜäöüß
吃饭.txt
....
使用 Oracle 的 Java 7 运行此示例,结果如下:
....
Folder-A��O��U��a��o��u����
������.txt
....
但是,如果我按如下方式设置环境(在上面两种情况下未设置):
LANG=en_US.UTF-8
Oracle的Java 7的结果与预期一样:
....
Folder-ÄÖÜäöüß
吃饭.txt
....
我的问题是我不想设置LANG环境变量。这是一个 GUI 应用程序,我想将其部署为 Mac OS X 应用程序,这样做,LS 环境设置
<key>LSEnvironment</key>
<dict>
<key>LANG</key>
<string>en_US.UTF-8</string>
</dict>
在 Info.plist 中不起作用(另请参阅此处)
在 Mac OS X 上的 Oracle 中,我该怎么做才能在 Java 7 中正确检索文件名,而无需设置 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
因此,如果 LANG 未设置,则可以看到 Files.list() 将一些字节替换为 UTF-8 “EF BF BD” = Unicode U+FFFD = 替换字符(仅来自 Oracle 的 Java 7)。