nomes de arquivos Java UTF-8 com o IBM JVM (AIX)

9

Estou tendo problemas para entender a maneira como a implementação de java.io.File da IBM JVM lida com o UTF-8 no AIX no sistema de arquivos JFS2. Eu suspeito que há uma propriedade do sistema que estou ignorando, mas ainda não consegui encontrá-la.

Vamos supor que eu tenha um arquivo chamado othér (onde é é U + 00E9 ou UTF-8 bytes 0xc3 0xa9 ). O nome do arquivo é codificado em UTF-8 e foi criado por um programa em C:

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

Se eu criar uma string Unicode em Java que seja representativa do nome do arquivo, ele não conseguirá abri-la. Além disso, se eu usar File.listFiles() em Java, ele insiste em tratar isso como uma string Latin1. Por exemplo:

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();
}

Os resultados deste programa são:

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

Portanto, parece que meus nomes de arquivos estão sendo tratados como Latin1. Tentei definir o file.encoding propriedade do sistema para UTF8 e o client.encoding.override propriedade do sistema para UTF-8 sem sucesso. Minhas configurações de LANG e LC_ALL são en_US.UTF-8 :

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

O "Primary Language Environment" do meu sistema, conforme configurado pelo SMIT, é "ISO8859-1". Eu realmente não sei o impacto total dessa configuração, mas não posso mudar isso. Eu suspeito que se eu pudesse mudar isso para "UTF8 English" então isso pode consertar o problema, mas como o JFS2 armazena nomes de arquivos em Unicode e Java opera em Unicode internamente, eu sinto como deveria haver uma solução mais geral para o problema.

Existe outra propriedade do sistema para o J9 que eu possa definir para forçar o uso de nomes de arquivos UTF-8, independentemente da configuração do meu SMIT?

A versão do AIX é 5.2, a versão do Java é o IBM J9 (1.5.0), o sistema de arquivos é o 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 

Atualização: isso ainda ocorre no 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
    
por Edward Thomson 19.10.2012 в 21:04
fonte

2 respostas

4

Eu encontrei a resposta. Eu realmente estou tentando ajudar aqui.

Esta é uma postagem do blog sobre o seu problema real. Eu prometo.

Tente executar seu programa com o conjunto de sinalizadores -Dsun.jnu.encoding=UTF-8 .

    
por durron597 24.10.2012 / 19:09
fonte
1

Consulte aqui link para obter uma lista de localidades válidas do AIX Suas exportações devem ficar assim, eu acho

  export LC_ALL=EN_US
  export LANG=EN_US
    
por Oualid Jabnoune 27.10.2012 / 19:54
fonte