9

我无法理解 IBM JVMjava.io.File在 JFS2 文件系统上处理 AIX 上的 UTF-8 的方式。我怀疑我忽略了一个系统属性,但我还没有找到它。

假设我有一个名为othér(其中é是 U+00E9 或 UTF-8 bytes 0xc3 0xa9)的文件。文件名以 UTF-8 编码,由 C 程序创建:

char filename[] = { 'o', 't', 'h', 0xc3, 0xa9, 'r', 0 };
open(filename, O_RDWR|O_CREAT, 0666);

如果我在 Java 中创建一个代表文件名的 Unicode 字符串,它将无法打开它。此外,如果我File.listFiles()在 Java 中使用,它坚持将其视为 Latin1 字符串。例如:

String expectedName = new String(new char[] { 'o', 't', 'h', 0xe9, 'r' });
File expected = new File(expectedName);
if (expected.exists())
    System.out.println(expectedName + " exists");
else
    System.out.println(expectedName + " DOES NOT exist");

for (File child : new File(".").listFiles())
{
    System.out.println(child.getName());
    System.out.print("Chars:");
    for (char c : child.getName().toCharArray())
        System.out.print(" 0x" + Integer.toHexString((int)c));
    System.out.println();
}

这个程序的结果是:

% java -Dfile.encoding=UTF8 FileTest
othér DOES NOT exist
othér
Chars: 0x6f 0x74 0x68 0xc3 0xa9 0x72

因此,我的文件名似乎被视为 Latin1。我尝试将file.encoding系统属性设置为UTF8client.encoding.override系统属性设置UTF-8为无济于事。我的LANGLC_ALL设置是en_US.UTF-8

% echo $LANG
en_US.UTF-8
% echo $LC_ALL
en_US.UTF-8

SMIT 配置的我系统的“主要语言环境”是“ISO8859-1”。我真的不知道此设置的全部影响,但我无法更改它。我怀疑如果我可以将其更改为“UTF8 英语”,那么这可能会解决问题,但由于 JFS2 以 Unicode 存储文件名,而 Java 在内部以 Unicode 运行,我觉得应该有一个更通用的解决方案来解决这个问题。

无论我的 SMIT 设置如何,我都可以设置 J9 的另一个系统属性来强制它使用 UTF-8 文件名吗?

AIX 版本是 5.2,Java 版本是 IBM J9 (1.5.0),文件系统是 JFS2:

rs6000% uname -a
AIX rs6000 2 5 000A9B7C4C00
rs6000% java -version
java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build pap32dev-20091106a (SR11 ))
IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 AIX ppc-32 j9vmap3223-20091104 (JIT enabled)
J9VM - 20091103_45935_bHdSMr
JIT  - 20091016_1845_r8
GC   - 20091026_AA)
JCL  - 20091106
rs6000% mount|grep /home
         /dev/hd1         /home            jfs2   Jun 27 16:02 rw,log=/dev/hd8 

更新:这仍然发生在 Java6 上:

% java -version
java version "1.6.0"
Java(TM) SE Runtime Environment (build pap3260sr11-20120806_01(SR11))
IBM J9 VM (build 2.4, JRE 1.6.0 IBM J9 2.4 AIX ppc-32 jvmap3260sr11-20120801_118201 (JIT enabled, AOT enabled)
J9VM - 20120801_118201
JIT  - r9_20120608_24176ifx1
GC   - 20120516_AA)
JCL  - 20120713_01
4

2 回答 2

4

我找到了答案。我真的想在这里提供帮助。

这是一篇关于您的实际问题的博客文章。我保证。

-Dsun.jnu.encoding=UTF-8尝试在设置标志的情况下运行您的程序。

于 2012-10-24T17:09:27.963 回答
1

请参阅此处http://www.ibm.com/developerworks/java/jdk/aix/118/README.html以获取有效 AIX 语言环境的列表 我认为您的导出应该如下所示

  export LC_ALL=EN_US
  export LANG=EN_US
于 2012-10-27T17:54:28.507 回答