Java UTF-8 имена файлов с IBM JVM (AIX)

У меня проблемы с пониманием того, как реализация IBM JVM java.io.File имеет дело с UTF-8 в AIX в файловой системе JFS2. Я подозреваю, что есть системное свойство, которое я пропускаю, но я еще не смог его найти.

Давайте предположим, что у меня есть файл с именем 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, является "ISO8859-1". Я действительно не знаю, какое влияние оказывает этот параметр, но я не могу его изменить. Я подозреваю, что если я смогу изменить это на "UTF8 English", то это может решить проблему, но поскольку JFS2 хранит имена файлов в Unicode, а Java работает в Unicode внутренне, я чувствую, что должно быть более общее решение проблемы.

Могу ли я установить другое системное свойство для J9, которое заставит его использовать имена файлов UTF-8 независимо от настроек SMIT?

Версия 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

2 ответа

Решение

Я нашел ответ. Я действительно пытаюсь помочь здесь.

Это сообщение в блоге о вашей актуальной проблеме. Я обещаю.

Попробуйте запустить вашу программу с -Dsun.jnu.encoding=UTF-8 флаг установлен.

Смотрите здесь http://www.ibm.com/developerworks/java/jdk/aix/118/README.html список действительных локалей AIX. Ваш экспорт должен выглядеть так, как мне кажется.

  export LC_ALL=EN_US
  export LANG=EN_US
Другие вопросы по тегам