Распакуйте файлы с арабским именем программно в Android - PullRequest
1 голос
/ 06 июня 2019

У меня есть приложение для Android, которое загружает сжатые файлы, а затем распаковывает их ..

отлично работает с английскими именными файлами ..

но если файл с арабским именем он ошибается, он отформатирован


E/UncaughtException: java.lang.IllegalArgumentException: MALFORMED[1]


это мой код ..

ценим вашу помощь

Спасибо


    private boolean unpackZip(String path, String zipname)
    {
        InputStream is;
        ZipInputStream zis;
        try
        {
            String filename;
            is = new FileInputStream(path + zipname);
            zis = new ZipInputStream(new BufferedInputStream(is));
            ZipEntry ze;
            byte[] buffer = new byte[1024];
            int count;

            while ((ze = zis.getNextEntry()) != null)
            {
                filename = ze.getName();

                // Need to create directories if not exists, or
                // it will generate an Exception...
                if (ze.isDirectory()) {
                    File fmd = new File(path + filename);
                    fmd.mkdirs();
                    continue;
                }

                FileOutputStream fout = new FileOutputStream(path + filename);

                while ((count = zis.read(buffer)) != -1)
                {
                    fout.write(buffer, 0, count);
                }

                fout.close();
                zis.closeEntry();
            }

            zis.close();
        }
        catch(IOException e)
        {
            e.printStackTrace();
            return false;
        }

        return true;
    }

1 Ответ

1 голос
/ 06 июня 2019

Попробуйте

new ZipInputStream(new BufferedInputStream(is), Charset.forName("Windows-1256"));

, по умолчанию используется UTF-8, и это, очевидно, не работает.


После обратной связи: очевидно, существует какая-то проблема с версией API Android.

Вы можете проверить:

filename = ze.getName();

Иногда можно «исправить» кодировку.Очень подвержен ошибкам или даже неосуществим.

filename = new String(filename.getBytes("..."), "...");

, где можно попробовать разные кодировки:

  • Windows-1256
  • UTF-8

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

...