Разархивируйте файлы, содержащие китайские иероглифы

У меня есть zip-файл. Он содержит несколько файлов. Файлы содержат китайские символы, поэтому я использовал

   ZipInputStream zipStream = new ZipInputStream(
            new BufferedInputStream(new FileInputStream(zipFilePath), BUFFER_SIZE),
            Charset.forName("ISO-8859-1")
    );

......

   FileOutputStream fileOutput = new FileOutputStream(uncompressedFileName);
                while (zipStream.available() > 0) {
                    fileOutput.write(zipStream.read());
                }

Извлечение выполняется успешно. После этого я хочу использовать метод encodingDetect для поиска кодировки, но теперь служба не работает. Она возвращает несоответствие. Если я отправляю файлы непосредственно в службу, служба работает. Она правильно находит кодировку, например UTF-8.

Я предполагаю, что Charset.forName("ISO-8859-1")извлеките файлы, но формат поврежден. У вас есть идеи?

Вы имеете в виду, что файл имена содержит китайские символы? Пожалуйста, опишите очень подробно, как вы вызываете encodingDetect?

kumesana 22.05.2019 13:50

Имя файла и содержимое файла содержат китайские символы. Метод EncodingDetect используется для поиска кодировки. Он работает правильно, если я отправляю файлы (не zip) непосредственно в метод, но если я отправляю файлы после метода извлечения, не может найти кодировку

sneijder10 22.05.2019 13:52

Пожалуйста, опишите, что для вас значит "очень подробно"

kumesana 22.05.2019 13:55

Я не могу найти кодировку файлов, если извлекаю файлы из zip.

sneijder10 22.05.2019 13:58

Вот что значит "очень подробно" для вас? Хорошо... Мы не используем одни и те же слова, так что трудно следить друг за другом. Удачи.

kumesana 22.05.2019 13:58
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
1
5
1 573
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Кодировка ISO-8859-1 определенно не поддерживает китайский язык. Используйте UTF-8 вместо ISO-8859-1.

Я имею в виду, вам нужно использовать правильную кодировку. Если задействован китайский язык, мы знаем, что правильная кодировка не iso-8859-1. Но у нас нет указаний, является ли это utf-8 или какой-либо дружественной к китайскому языку кодировкой.

kumesana 22.05.2019 13:57

Когда я использовал utf-8, извлечение не выполняется. Я не могу извлечь zip-файлы.

sneijder10 22.05.2019 13:59

Вы можете попробовать вообще не отправлять параметр charset. Он будет использовать кодировку вашей системы по умолчанию

Michael Gantman 22.05.2019 14:06
Ответ принят как подходящий

Проблема заключается в кодировке имен файлов в zip. UTF-8 выдает ошибку (имена файлов явно не в UTF-8), так как UTF-8 требует особого формата для многобайтовых последовательностей, и, видимо, есть неправильные "многобайтовые" последовательности.

ISO-8859-1 — это кодировка одного байта, принимающая мусор.

Что вам нужно сделать, так это попробовать небольшое количество Китайские кодировки, чтобы строки имени файла были заполнены правильно. Строка Java содержит Unicode, поэтому может содержать любой набор символов. Помощь от кого-то говорящего по-китайски, вероятно, имела бы смысл.

А затем попробуйте записать файлы с такими именами. Если на вашем компьютере это не удастся, вы должны использовать искусственные имена файлов, например, транслитерация с китайского.

Может быть создана таблица перевода оригинального имени файла на китайском языке в фактическое имя файла. как текстовый файл UTF-8, возможно, со спецификацией, '\uFEFF` в начале файла.

Большое спасибо. Я обновил свой код. Имя файла - UTF-8, и я правильно извлекаю файлы. Но файл содержит китайские символы. Как я понимаю, мне нужно написать файл с правильной кодировкой, чтобы иметь возможность найти кодировку в методе encodingDetect.

sneijder10 22.05.2019 16:07

Нет, сам файл - это просто двоичные данные. Если он представляет (китайский) текст в какой-то неизвестной кодировке, я ожидаю, что encodingDetect найдет эту кодировку. И тогда у вас есть кодировка/набор символов, чтобы прочитать его или преобразовать в текст UTF-8.

Joop Eggen 22.05.2019 16:22

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