Codificação de String (UTF-8, ISO-8859-1, etc)

1 resposta
gutostraube

Olá!

Existe uma forma de eu decodificar uma String para um charset padrão?

Meu problema é o seguinte: tenho que conectar à vários servidores HTTP, que podem ter diferentes codificações, e retornar o conteúdo da página HTML, mas em alguns casos, caracteres "estranhos" aparecem devido a diferença de codificação.

Fiz um esquema assim:

public String connect() throws IOException {
    String content = "";
    if (getConnection() != null) {
        getConnection().connect();
        if (getConnection().getResponseCode() == 200) {
            InputStream in = getConnection().getInputStream();

            String contentType = getConnection().getHeaderField("content-type");

            if (contentType != null && contentType.toLowerCase().contains("utf-8")) {
                Charset utf8 = Charset.forName("UTF-8");
                CharsetDecoder decoder = utf8.newDecoder();
                int c;
                List<Byte> bList = new Vector<Byte>();
                while ((c = in.read()) != -1)
                    bList.add(new Byte((byte) c));
                byte[] bArray = new byte[bList.size()];
                int i = 0;
                for (Byte b : bList)
                    bArray[i++] = b.byteValue();
                CharBuffer chrBuf = decoder.decode(ByteBuffer.wrap(bArray));
                content = chrBuf.toString();
            } else {
                int c;
                StringBuffer buf = new StringBuffer();
                while ((c = in.read()) != -1)
                    buf.append((char) c);
                content = buf.toString();
            }
            in.close();
        }
    }
    setContent(content);
    return content;
}

O problema é que, em alguns casos, a seguinte exceção é lançada:

java.nio.charset.MalformedInputException: Input length = 1
	at java.nio.charset.CoderResult.throwException(CoderResult.java:260)
	at java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:771)

Existe também situações em que o Content-type não é informado no Header.

Alguém tem alguma sugestão de como eu posso decodificar a página independentemente das informações do Header HTTP?

Obrigado!

1 Resposta

T

Se você vai puxar páginas de sites em inglês ou português, pode usar ISO-8859-1 ou Windows-1252 se você não conseguir as informações adequadas. O máximo que vai ocorrer é que você pode acabar obtendo caracteres incorretamente acentuados se a página efetivamente estiver em UTF-8 mas isso não for corretamente declarado.

Esse problema na verdade é bastante complexo; se você for ver, mesmo o browser (IE, Firefox) nem sempre consegue acertar a codificação correta, e você acaba tendo de acertar “na mão”.

Criado 4 de outubro de 2007
Ultima resposta 4 de out. de 2007
Respostas 1
Participantes 2