IBMJVMの実装がjava.io.File
JFS2ファイルシステム上のAIX上のUTF-8を処理する方法を理解するのに問題があります。見落としているシステムプロパティがあるのではないかと思いますが、まだ見つかりませんでした。
名前の付いたファイルがあるとしましょうothér
(ここで、é
はU + 00E9またはUTF-8バイト0xc3 0xa9
です)。ファイル名はUTF-8でエンコードされ、Cプログラムによって作成されました。
char filename[] = { 'o', 't', 'h', 0xc3, 0xa9, 'r', 0 };
open(filename, O_RDWR|O_CREAT, 0666);
ファイル名を表すUnicode文字列をJavaで作成すると、それを開くことができません。さらに、私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
システムプロパティを無効に設定してみました。私と設定は:UTF8
client.encoding.override
UTF-8
LANG
LC_ALL
en_US.UTF-8
% echo $LANG
en_US.UTF-8
% echo $LC_ALL
en_US.UTF-8
SMITによって構成された私のシステムの「PrimaryLanguageEnvironment」は「ISO8859-1」です。この設定がどのような影響を与えるかはわかりませんが、変更することはできません。これを「UTF8English」に変更できれば問題は解決するのではないかと思いますが、JFS2はファイル名をUnicodeで保存し、Javaは内部でUnicodeで動作するため、より一般的な解決策があるはずです。
SMIT設定に関係なくUTF-8ファイル名を使用するように強制するように設定できるJ9の別のシステムプロパティはありますか?
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