Создание архива tar с национальными символами на Java

Знаете ли вы какую-нибудь библиотеку/способ на Java для создания tar-архива с именами файлов в соответствующей национальной кодовой странице Windows (например, cp1250).

Я пробовал использовать Java tar, пример кода:

final TarEntry entry = new TarEntry( files[i] );
String filename = files[i].getPath().replaceAll( baseDir, "" );
entry.setName( new String( filename.getBytes(), "Cp1250" ) );
out.putNextEntry( entry );
...

Это не работает. Национальные символы сломаны там, где я извлекаю смолу в окнах. Я также обнаружил странную вещь: под Linux польские национальные символы отображаются правильно только при использовании ISO-8859-1:

entry.setName( new String( filename.getBytes(), "ISO-8859-1" ) );

Несмотря на то, что правильная польская кодовая страница — ISO-8859-2, она тоже не работает. Я также пробовал Cp852 для Windows, безрезультатно.

Я знаю ограничения формата tar, но изменить его не вариант.

Спасибо за предложения,


person pawelsto    schedule 29.09.2009    source источник


Ответы (2)


Официально TAR не поддерживает заголовки, отличные от ASCII. Однако я смог использовать имена файлов в кодировке UTF-8 в Linux.

Вы должны попробовать это,

String filename = files[i].getName();
byte[] bytes = filename.getBytes("Cp1250")
entry.setName(new String(bytes, "ISO-8859-1"));
out.putNextEntry( entry );

Это, по крайней мере, сохраняет байты в Cp1250 в заголовках TAR.

person ZZ Coder    schedule 29.09.2009
comment
Большое спасибо! Оно работает. Национальные символы после распаковки в Windows в порядке. Я должен изучить конструкцию «новая строка (имя файла.getBytes (Cp1250), ISO-8859-1)» и правильно ее понять. - person pawelsto; 30.09.2009
comment
Вы должны прочитать код TAR, чтобы увидеть, как он работает. TAREntry не понимает кодировку. Он просто копирует младший байт символа UTF-16 в файл TAR. В Unicode младший байт полностью отображается на Latin-1, поэтому мы используем Latin-1 для сохранения массива байтов. Это вообще не имеет ничего общего с кодировкой Latin-1. - person ZZ Coder; 30.09.2009

tar не допускает использование значений, отличных от ASCII, в своих заголовках. Если вы попробуете другую кодировку, результат, вероятно, будет зависеть от того, что целевая платформа решит сделать с этими значениями байтов. Похоже, что программа tar вашей целевой платформы интерпретирует байты как ISO-8859-1, поэтому это «работает».

Взгляните на расширенные атрибуты? http://www.freebsd.org/cgi/man.cgi?query=tar&sektion=5&manpath=FreeBSD+8-current

Я не эксперт здесь, но это, кажется, единственный официальный способ поместить любые значения, отличные от ASCII, в заголовок файла tar.

person Sean Owen    schedule 29.09.2009