Pergunta

Você conhece alguma biblioteca/maneira em Java para gerar arquivo TAR com nomes de arquivos na sede de codificação nacional do Windows adequada (por exemplo, CP1250).

Eu tentei com Java Tar, código de exemplo:

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

Não funciona. Os personagens nacionais estão quebrados onde eu extrai alcatrão nas janelas. Eu também encontrei uma coisa estranha, sob os caracteres nacionais poloneses Linux são mostrados corretamente apenas quando eu usei o ISO-8859-1:

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

Apesar do fato de que a correção de código polonesa adequada é ISO-8859-2, o que também não funciona. Também tentei o CP852 para Windows, sem efeito.

Conheço as limitações do formato alcatrão, mas mudar isso não é uma opção.

Obrigado por sugestões,

Foi útil?

Solução

Oficialmente, o TAR não suporta não-ASCII em cabeçalhos. No entanto, pude usar nomes de arquivos codificados UTF-8 no Linux.

Você deveria tentar isso,

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

Isso pelo menos preserva os bytes no CP1250 em cabeçalhos de alcatrão.

Outras dicas

O TAR não permite valores não-ASCII em seus cabeçalhos. Se você tentar uma codificação diferente, o resultado provavelmente estará no que a plataforma de destino decide fazer com esses valores de bytes. Parece que o programa Tar da plataforma de destino está interpretando os bytes como ISO-8859-1, e é por isso que isso 'funciona'.

Dê uma olhada nos atributos estendidos? http://www.freebsd.org/cgi/man.cgi?querery=tar&sektion=5&manpath=frebrebsd+8-current

Não sou especialista aqui, mas essa parece ser a única maneira oficial de colocar valores não-ASCII em um cabeçalho de arquivo TAR.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top