Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скачал страницу, получил иероглифы? 
:(
    Опции темы
unkis
  Дата 10.3.2007, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



Ребята такая проблема, я при помощи Apache HttpClient качаю страницу, но когда я её сохраняю то у меня одни иероглифы.
В броузере она отображается без проблем, страница содержит русский текст.

Код

  HttpClient client = new HttpClient();
  GetMethod method = new GetMethod(url);
                    method.setRequestHeader("Cookie", cookie);
            method.setRequestHeader( "User-agent","Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6");
            method.setRequestHeader( "Accept","text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
            method.setRequestHeader( "Accept-Language","de-de,de;q=0.8,en-us;q=0.5,en;q=0.3");
            method.setRequestHeader( "Accept-Encoding","gzip,deflate");
            method.setRequestHeader( "Accept-Charset","ISO-8859-1,utf-8;q=0.7,*;q=0.7");
            method.setRequestHeader( "Keep-Alive","300");
            method.setRequestHeader( "Proxy-Connection","keep-alive");
            method.setRequestHeader( "Cache-Control","max-age=0");
//            client.setTimeout(5000);
            try {
              // Execute the method.
              int statusCode = client.executeMethod(method);
              method.setFollowRedirects(true);
              if (statusCode != HttpStatus.SC_OK) {
                System.err.println("Method failed: " + method.getStatusLine());
              }

              // Read the response body.
              StringBuffer responseBody = new StringBuffer("");
              byte[] body =method.getResponseBody();
             for (byte b : body) {
              responseBody.append((char)b);
            }

              // Deal with the response.
              // Use caution: ensure correct character encoding and is not binary data
              System.out.println(new String(responseBody));


что делаю не так?


--------------------
www.unkis.com
PM MAIL WWW   Вверх
Бонифаций
Дата 11.3.2007, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: нет
Всего: 40



строки в жабе хранятся в юникоде. Когда вы делаете 

 for (byte b : body) 
{
   responseBody.append((char)b);
}

жаба добавляет по юникодной букве в строку исходя из байта. Что для русского текста даст естественно не то. Попробуйте 

сделать ByteBuffer из byte[] (метод wrap). Затем CharBuffer из этого ByteBuffer с нужной кодировкой

типа
Код

Charset cs = Charset.forName( "Cp1251" /* encoding */ );
ByteBuffer bb = ByteBuffer.wrap( b );
CharBuffer cb = cs.decode( bb );
String s = cb.toString();





--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
unkis
Дата 11.3.2007, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



Код

byte[] body =method.getResponseBody();

             Charset cs = Charset.forName( "Cp1251" /* encoding */ );
             ByteBuffer bb = ByteBuffer.wrap( body );
             CharBuffer cb = cs.decode( bb );
             String s = cb.toString();


никакого эффекта, там где между тегами должны стоять русские буквы стоят вопросики


--------------------
www.unkis.com
PM MAIL WWW   Вверх
Бонифаций
Дата 11.3.2007, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: нет
Всего: 40



а кодировка страницы какая?


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
unkis
Дата 11.3.2007, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



mozilla пишет что windows-1251

Добавлено @ 02:00 
вообще не понятно, как скачать страницу с русским содержанием, и найти в нем хотя бы одно русское слово, если что можно пример.

Добавлено @ 02:01 
к примеру вот эту страницу http://www.kinoclub.org/


--------------------
www.unkis.com
PM MAIL WWW   Вверх
AntonioBanderaz
Дата 11.3.2007, 02:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 18



Пожалуйста
Код

        URL url = new URL("http://www.kinoclub.org/");
        URLConnection conn = url.openConnection();
        InputStream isr = ((InputStream)conn.getContent());
        byte b[] = new byte[isr.available()];
        int res = isr.read(b);
        String resp = new String(b, "CP1251");
        System.out.println(resp);


Добавлено @ 02:49 
Или в твоём случае можно 
Код

/*
             byte[] body =method.getResponseBody();
             for (byte b : body) {
              responseBody.append((char)b);
            }
*/
// заменить на
String body = new String(method.getResponseBody(), "CP1251");



--------------------
ГЫ... 
PM MAIL ICQ   Вверх
unkis
Дата 11.3.2007, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



спасибо, а теперь если мне надо найти скажем слов "Новости", то мне просто надо сделать так?

Код

String body = new String(method.getResponseBody(), "CP1251");
body.indexOf("Новости");


правильно?
Но почему-то у меня не работает.


--------------------
www.unkis.com
PM MAIL WWW   Вверх
AntonioBanderaz
Дата 11.3.2007, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 18



ну не знаю у меня 5822... )

Добавлено @ 16:30 
Код

import java.net.URL;
import java.net.URLConnection;
import java.io.IOException;
import java.io.InputStream;

public class HTTPClientTest {
    public static void main(String arg[]) throws IOException {
        URL url = new URL("http://www.kinoclub.org/");

        StringBuffer sbuf = new StringBuffer();

        URLConnection conn = url.openConnection();
        InputStream isr = ((InputStream)conn.getContent());
        int b = 0;
        while((b = isr.read()) > -1) {
            byte bt[] = {(byte)b};
            sbuf.append(new String(bt, "CP1251"));
        }
        System.out.println("То что загрузилось: " + sbuf.length());
        System.out.println("Новости: " + sbuf.indexOf("Новости"));
        System.out.println("Кино: " + sbuf.indexOf("Кмно"));
    }
}


Код

D:\Programs\Java6\bin\java -Didea.launcher.port=7534 "-Didea.launcher.bin.path=D:\Programs\IDEA Selena\bin" -Dfile.encoding=UTF-8 -classpath "D:\Programs\Java6\jre\lib\charsets.jar;D:\Programs\Java6\jre\lib\deploy.jar;D:\Programs\Java6\jre\lib\javaws.jar;D:\Programs\Java6\jre\lib\jce.jar;D:\Programs\Java6\jre\lib\jsse.jar;D:\Programs\Java6\jre\lib\management-agent.jar;D:\Programs\Java6\jre\lib\plugin.jar;D:\Programs\Java6\jre\lib\resources.jar;D:\Programs\Java6\jre\lib\rt.jar;D:\Programs\Java6\jre\lib\ext\dnsns.jar;D:\Programs\Java6\jre\lib\ext\localedata.jar;D:\Programs\Java6\jre\lib\ext\sunjce_provider.jar;D:\Programs\Java6\jre\lib\ext\sunmscapi.jar;D:\Programs\Java6\jre\lib\ext\sunpkcs11.jar;D:\jProjects\pfr\webapp\WEB-INF\classes;D:\Programs\IDEA Selena\lib\javaee.jar;G:\[Programs]\[Programming]\[Java]\[Fraimwork]\gwt-windows-1.3.3\gwt-windows-1.3.3\gwt-user.jar;D:\Programs\IDEA Selena\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain HTTPClientTest

То что загрузилось: 39030
Новости: 5822
Кино: -1

Process finished with exit code 0



--------------------
ГЫ... 
PM MAIL ICQ   Вверх
unkis
Дата 11.3.2007, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



спасибо действительно заработало, а насколько эффективно скачивать страницу по байтно, может есть более эффективное решение


--------------------
www.unkis.com
PM MAIL WWW   Вверх
AntonioBanderaz
Дата 11.3.2007, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 18



Зато ты можешь быть уверен что страница скачена полностью.

Добавлено @ 19:21 
и скачиваешь ты её не побайтно, а пакетно, просто читаешь из буфера побайтно. 


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
LSD
Дата 12.3.2007, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Цитата(unkis @  11.3.2007,  18:42 Найти цитируемый пост)
а насколько эффективно скачивать страницу по байтно, может есть более эффективное решение

Намного менее эффективно чем:
Код
int read;
byte[] buffer = new byte[64 * 1024];
long time = System.currentTimeMillis();
while((read = isr.read(buffer)) != -1)
{
  if(read > 0)
    sbuf.append(new String(buffer, 0, read, "CP1251"));
}

и хотя на медленных соединениях это будет не так заметно, но на быстрых разница будет ощутима (попробуй так почитать из файла например).
Во вторых с многобайтными кодировками, такой прием не будет работать вообще. Поэтому я рекомендую:
Код
Reader reader = new InputStreamReader(isr, "CP1251");
int read;
char[] buffer = new char[64 * 1024];
long time = System.currentTimeMillis();
while((read = reader.read(buffer)) != -1)
  sbuf.append(buffer, 0, read);



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0550 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.