Вопрос

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

Я пытался с Java - тар, пример кода:

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

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

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

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

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

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

Это было полезно?

Решение

Официально 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.

Другие советы

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

Взгляните на расширенные атрибуты? http://www.freebsd.org/cgi/man.cgi ?запрос=tar& раздел=5&manpath=FreeBSD+8-текущий

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top