Как узнать кодировку полученной строки?

 
 
 
Сообщения:42
Доброго времени суток всем.
Есть парсер HTML страниц - он дергает какой то определенный текст.
Так вот страницы разные, поэтому при вытаскивании русского текста и при выводе на экран (в консоль) резултат выдачи с некоторых страниц получается неудовлетворителоьным - а именно - кривая кодировка.
Т.е. что то отображается замечательно, а что то коряво.
Каким способом решить эту проблему? Может как то можно определить кодировку в которой написана строка?
 
 
Сообщения:1165
nervouselectronic:
Доброго времени суток всем.
Есть парсер HTML страниц - он дергает какой то определенный текст.
Так вот страницы разные, поэтому при вытаскивании русского текста и при выводе на экран (в консоль) резултат выдачи с некоторых страниц получается неудовлетворителоьным - а именно - кривая кодировка.
Т.е. что то отображается замечательно, а что то коряво.
Каким способом решить эту проблему? Может как то можно определить кодировку в которой написана строка?


никак - это своего рода баг+патч в HTTP/HTML. Скорее всего решение должно быть аппликативным...

Разве что вот такая идея сейчас пришла в голову - можно попробовать создать
String str = new String (inputBytesFromStream,"Cp1251");
String str = new String (inputBytesFromStream,"UTF-8");
и тд...
потом проверить, после каждой перекодировки, есть ли "???" (ASCII = 63) в этом стринге в больших кол-ва... если да то не "угадали" кодировку. Если же нету ??? то остается надеяться на лучшее... :shock:

The meaning of life, universe and everything is 42!
 
 
Сообщения:1165
подобная проблема так же наблюдается в таком примере
http://www.javatalks.ru/ftopic2853.php
может быть есть алгоритмы для джавы которые пытаются решить эту проблемму как Notepad...

а может и я чего нить не знаю :)

The meaning of life, universe and everything is 42!
 
 
Сообщения:42
Возникла идея - узнавать кодировку из самой страницы или из хидера.
Какие есть мнения по этому поводу?
 
 
Сообщения:1165
nervouselectronic:
Возникла идея - узнавать кодировку из самой страницы или из хидера.
Какие есть мнения по этому поводу?

не могли вы поточнее описать задачу, поставленную перед вами ?

The meaning of life, universe and everything is 42!
 
 
Сообщения:3874
Попробуйте http://code.google.com/p/juniversalchardet/

Я использовал так:

import java.io.IOException;
import java.io.InputStream;

import org.mozilla.universalchardet.UniversalDetector;

/**
 * Character detector implementation based on 
 * Google's <a href="http://juniversalchardet.googlecode.com/files/juniversalchardet-1.0.jar">juniversalchardet</a> library. 
 */
public class CharacterDetector {

    private static CharacterDetector instance;
    
    // Private constructor
    private CharacterDetector() {}
    
    private UniversalDetector detector = new UniversalDetector(null);
    
    public static final CharacterDetector getInstance(){
        if ( instance == null ) instance = new CharacterDetector();
        return instance;
    }
    
    /**
     * Detects character encoding for the data from the supplied <tt>stream</tt>.
     * Returns <tt>null</tt> if encoding cannot be determined.
     * 
     * @param stream 
     * @return name of the detected character encoding, or <tt>null</tt> if encoding cannot be determined 
     */
    public String detect(InputStream stream) throws IOException {
        // Reset detector before using
        detector.reset();
        // Buffer
        byte[] buf = new byte[1024];
        try {
            int nread;
            while ((nread = stream.read(buf)) > 0 && !detector.isDone()) {
              detector.handleData(buf, 0, nread);
            }
            detector.dataEnd();
            return detector.getDetectedCharset();
        } finally {
            detector.reset();
        }
    }
}
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет