使用不同的编码下载在线文本

时间:2015-07-13 11:05:24

标签: java android encoding utf-8 iso-8859-1

我正在下载可由用户上传的在线文字,因此文字可以是UTF-8,ISO-8859-1等......

问题在于我不知道编码是否正在使用用户,如果用户上传了UTF-8文本,它的工作完美但是如果用户上传了带有重音符号的ISO-8859-1文本(á é等..)这些字符没有正确显示。

我试图将文本编码强制为UTF-8,但它并不适用于所有情况(buffer.toString(“UTF-8”))

这是我的代码:

javaUrl = new URL(URLParser.parse(textResource.getUrlStr()));
                    connection = javaUrl.openConnection();                      
                    connection.setConnectTimeout(2000);
                    connection.setReadTimeout(2000);
                    InputStream input = new BufferedInputStream(connection.getInputStream());
                    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
                    int nRead;
                    try{        
                        byte [] data = new byte [1024];
                        while ((nRead = input.read(data, 0, data.length)) != -1) {
                            buffer.write(data, 0, nRead);
                        }
                        buffer.flush();
                        total = buffer.toString();                  
                    }finally{
                        input.close();
                        buffer.close();
                    }

1 个答案:

答案 0 :(得分:2)

由于你有多种可能的编码而且你不知道哪种编码是正确的,你别无选择,只能在这里使用CharsetDecoder

计划:

  • 从连接中打开InputStream;
  • 将所有内容读入byte[]数组;
  • 尝试使用不同的编码,直到找到合适的编码。

以下是找到正确编码的一种可能方法:

public boolean isCharset(final Charset charset, final byte[] contents)
    throws IOException
{
    final CharsetDecoder decoder = charset.newDecoder()
        .onMalformedInput(CodingErrorAction.REPORT);
    final ByteBuffer buf = ByteBuffer.wrap(contents);

    try {
        decoder.decode(buf);
        return true;
    } catch (CharacterCodingException ignored) {
        return false;
    }
}

尝试使用不同的编码集(最好从UTF-8开始)。