2009-09-29 3 views
2

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

Я попытался с 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 для окон, без эффекта.

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

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

ответ

1

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

+0

Большое спасибо! Оно работает. Национальные символы после распаковки в Windows в порядке. Мне нужно изучить конструкцию '' new String (filename.getBytes («Cp1250»), «ISO-8859-1») и понять ее правильно. – pawelsto

+1

Вы должны прочитать код TAR, чтобы посмотреть, как он работает. TAREntry не понимает кодировку. Он просто копирует младший байт символа UTF-16 в файл TAR. В Unicode младший байт полностью отображается на латиницу-1, поэтому мы используем Latin-1 для сохранения массива байтов. Это никак не связано с кодировкой Latin-1. –

0

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

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

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

Смежные вопросы