Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с кодировкой  (Прочитано 7586 раз)
0 Пользователей и 1 Гость смотрят эту тему.
fml1
Гость
« : 01-04-2005 10:42 » 

Запаковываем htm файл в кодировке Win1251 с помощью ZipOutputStream. В архиве, в сжатом файле русские буквы заменяются на $%^&#*(
а английские в порядке.
Как эти грабли исправить?
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 01-04-2005 11:59 » 

Как ты формируешь строку байтов для записи в ZipOutputStream?

Распечатай эту строку побайтово, посмотри, как в ней представлены русские буквы.  Может быть, они портятся ещё до сжатия.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
fml1
Гость
« Ответ #2 : 01-04-2005 12:50 » 

Цитата
Как ты формируешь строку байтов для записи в ZipOutputStream?

Распечатай эту строку побайтово, посмотри, как в ней представлены русские буквы. Может быть, они портятся ещё до сжатия.

Вот код архивации:

    String s = "1.htm";

      FileOutputStream f =
        new FileOutputStream("test.zip");
      CheckedOutputStream csum =
        new CheckedOutputStream(
          f, new CRC32());
      ZipOutputStream out =
        new ZipOutputStream(
          new BufferedOutputStream(csum));
      out.setComment("A test of Java Zipping");
      // Хотя нет соответствующего getComment().
      for(int j = 0; i < 1; i++) {
        System.out.println(
          "Writing file " + s);
        BufferedReader in =
          new BufferedReader(
            new FileReader(s));
        out.putNextEntry(new ZipEntry(s));
        while((c = in.read()) != -1)
          out.write(c);
        in.close();
      }
      out.close();
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 01-04-2005 13:21 » 

Проблема в том, как ты читаешь символы из входного потока.

BufferedReader in =
 new BufferedReader(
 new FileReader(s));
 out.putNextEntry(new ZipEntry(s));
 while((c = in.read()) != -1)
 

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

Код:
          System.out.println(
          "Writing file " + s);
          FileInputStream in =
          new FileInputStream(s);
          out.putNextEntry(new ZipEntry(s));
          byte buf[] = new byte[4096];
          int c;
          while((c = in.read(buf)) != -1)
              out.write(buf, 0, c);
          in.close();

Я проверил на Windows 2000, JDK 1.4.1. Работает нормально.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines