Создание архива tar с национальными символами на Java
-
18-09-2019 - |
Вопрос
Знаете ли вы какую-нибудь библиотеку / способ в 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.