9

IBMJVMの実装がjava.io.FileJFS2ファイルシステム上の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システムプロパティを無効に設定してみました。私と設定は:UTF8client.encoding.overrideUTF-8LANGLC_ALLen_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
4

2 に答える 2

4

私は答えを見つけました。私は本当にここで助けようとしています。

これは、実際の問題に関するブログ投稿です。約束します。

-Dsun.jnu.encoding=UTF-8フラグを設定してプログラムを実行してみてください。

于 2012-10-24T17:09:27.963 に答える
1

有効なAIXロケールのリストについては、ここhttp://www.ibm.com/developerworks/java/jdk/aix/118/README.htmlを参照してください。エクスポートは次のようになります。

  export LC_ALL=EN_US
  export LANG=EN_US
于 2012-10-27T17:54:28.507 に答える