我使用Java 7 from Oracle在Mac OS X上使用File.list()获取文件名为非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
....
使用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应用程序,这样做,LSEnvironment设置会被忽略。
<key>LSEnvironment</key>
<dict>
<key>LANG</key>
<string>en_US.UTF-8</string>
</dict>
在 Info.plist 中的 LSEnvironment 不起作用(也可以参见 此处)。
我该怎么做才能从 Oracle 的 Java 7 中正确检索 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
因此我们可以看到,如果未设置LANG(仅适用于来自Oracle的Java 7版本),Files.list()将使用UTF-8 "EF BF BD" = Unicode U+FFFD = 替换字符替换一些字节。
.bashrc
或类似的东西吗? - Joni