Вопрос по java, encoding – Добавить не-ASCII имена файлов в zip в Java

19

Какой лучший способ добавитьnon-ASCII имена файлов вzip file с помощьюJavaтаким образом, что файлы могут быть правильно прочитаны в обоихWindows а такжеLinux?

Вот одна попытка, адаптированная изhttps://truezip.dev.java.net/tutorial-6.html#Example, который работает в Windows Vista, но не работает в Ubuntu Hardy. В Hardy имя файла отображается как abc - & # x416; & # x414; & # x424; .txt в файле-ролике.

import java.io.IOException;
import java.io.PrintStream;

import de.schlichtherle.io.File;
import de.schlichtherle.io.FileOutputStream;

public class Main {

    public static void main(final String[] args) throws IOException {

        try {
            PrintStream ps = new PrintStream(new FileOutputStream(
                    "outer.zip/abc-åäö.txt"));
            try {
                ps.println("The characters åäö works here though.");
            } finally {
                ps.close();
            }
        } finally {
            File.umount();
        }
    }
}

В отличие от java.util.zip, truezip позволяет указать кодировку zip-файла. Вот другой пример, на этот раз явно указывающий кодировку. Ни IBM437, ни UTF-8, ни ISO-8859-1 не работают в Linux. IBM437 работает в Windows.

import java.io.IOException;

import de.schlichtherle.io.FileOutputStream;
import de.schlichtherle.util.zip.ZipEntry;
import de.schlichtherle.util.zip.ZipOutputStream;

public class Main {

    public static void main(final String[] args) throws IOException {

        for (String encoding : new String[] { "IBM437", "UTF-8", "ISO-8859-1" }) {
            ZipOutputStream zipOutput = new ZipOutputStream(
                    new FileOutputStream(encoding + "-example.zip"), encoding);
            ZipEntry entry = new ZipEntry("abc-åäö.txt");
            zipOutput.putNextEntry(entry);
            zipOutput.closeEntry();
            zipOutput.close();
        }
    }
}
В JDK до v7 существовала давняя ошибка - существует 9 лет - она не позволяла корректно обрабатывать имена файлов с именами, которые нельзя кодировать с помощью IBM CP437.bugs.sun.com/bugdatabase/view_bug.do?bug%5Fid=4244499  По-видимому, это было исправлено в JDK7.blogs.oracle.com/xuemingshen/entry/non_utf_8_encoding_in  Поэтому, похоже, одно решение - использовать JDK7 и новые конструкторы для ZipInputStream, ZipOutputStream и ZipFile. Cheeso
truezip с UTF-8 работал для меня на Windows 7 и Mac OS X 10.6.x. Это все еще не работает в Linux? Anton Kuzmin

Ваш Ответ

7   ответов
7

mplementation потока zip:http://commons.apache.org/compress/apidocs/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.html#setEncoding%28java.lang.String%29

Вызова setEncoding («UTF-8») в вашем потоке должно быть достаточно.

8

согласно спецификации, принадлежащей PKWare, кодировка имен файлов и комментариев к файлам - IBM437. В 2007 году PKWare расширил спецификации, чтобы также разрешить UTF-8. Это ничего не говорит о кодировке файлов, содержащихся в zip. Только кодировка имен файлов.

Я думаю, что все инструменты и библиотеки (Java и не Java) поддерживают IBM437 (который является расширенным набором ASCII), и меньшее количество инструментов и библиотек поддерживают UTF-8. Некоторые инструменты и библиотеки поддерживают другие кодовые страницы. Например, если вы заархивировали что-то с помощью WinRar на компьютере, работающем в Шанхае, вы получите кодовую страницу Big5. Это не "разрешено" по спецификации почтового индекса, но это все равно происходит.

DotNetZip библиотека для .NET поддерживает Unicode, но, конечно, это не поможет вам, если вы используете Java!

Используя встроенную поддержку Java для ZIP, вы всегда получите IBM437. Если вам нужен архив с чем-то отличным от IBM437, используйте стороннюю библиотеку или создайте JAR.

Error: User Rate Limit ExceededstillError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
8

и Sun / Oracle действительно исправили долгоживущую ошибку / rfe:

Теперь возможноустановить кодировки файлов при создании почтовый файл / поток (requires Java 7).

Error: User Rate Limit Exceededimg819.imageshack.us/img819/4199/croppercapture6l.jpg
Error: User Rate Limit Exceededblogs.oracle.com/xuemingshen/entry/non_utf_8_encoding_in
3

руководство - они рекомендуют формат JAR:

It uses UTF-8 for file name encoding and comments - unlike ZIP, which only uses IBM437.

Это, вероятно, означает, что API используетjava.util.zip пакет для его реализации; эта документация утверждает, что она все еще используетZIP формат с 1996 года, Поддержка Unicode не была добавлена кСпецификация формата файла PKWARE .ZIP до 2006 года

10

IBM. Многие символы, используемые на других языках, невозможно использовать таким образом.

PKWARE-спецификация относится к проблеме и добавляет немного. Но это более позднее дополнение (с 2007 года спасибо Cheeso за разъяснения, см. Комментарии). Если этот бит установлен, запись имени файла должна быть закодирована в UTF-8. Это расширение описано в «ПРИЛОЖЕНИИ D - Языковая кодировка (EFS)», которое находится в конце связанного документа.

Для Java это известная ошибка, приводящая к проблемам с не-ASCII-символами. Увидетьошибка # 4244499 и большое количество связанных ошибок.

Мой коллега использовал в качестве обходного пути URL-кодирование для имен файлов перед сохранением их в ZIP и расшифровкой после прочтения. Если вы контролируете и хранение, и чтение, это может быть обходным путем.

РЕДАКТИРОВАТЬ: В баге кто-то предлагает использовать ZipOutputStream из Apache Ant в качестве обходного пути. Эта реализация позволяет задавать кодировку.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

. Не предусмотрено сохранение настроек кодировки в ZIP-файлах; клиенты склонны угадывать «текущую системную кодовую страницу», что вряд ли будет тем, что вы хотите. Многие комбинации клиента и кодовой страницы могут привести к недоступности файлов.

Сожалею!

Error: User Rate Limit Exceeded
0

имер, шрифт с разными глифами для этих кодов) Я видел аналогичные проблемы в Windows, где рендеринг "сломался" потому что шрифт не поддерживает кодировку, но данные на самом деле были целыми и правильными.

Error: User Rate Limit Exceeded Micke

Похожие вопросы