Java 下载不同编码的在线文本

Java 下载不同编码的在线文本,java,android,encoding,utf-8,iso-8859-1,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(

我正在下载在线文本,用户可以上传,因此文本可以是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();
                    }

由于您有多种可能的编码,并且您不知道哪种编码是正确的,因此除了在此处使用
CharsetDecoder
之外,您别无选择

该计划:

  • 从连接打开
    InputStream
  • 将所有内容读入
    字节[]
    数组
  • 尝试使用不同的编码,直到找到合适的编码
以下是找到正确编码的一种可能方法:

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开始)。

您在处理资源时遇到了很多问题……我需要在没有外部第三方库(如Guavaho)的情况下实现这一点。如何使用您的函数?给我一个用isCharset(Charset.forName(“ISO-8859-1”)、buffer.toByteArray()尝试调用pleaseok参数的例子,它似乎正在工作,现在我必须检查每个可能的字符集,直到找到一个true,然后将字符串解析为该字符集?那么,嗯,你的意思是你真的想要字符串结果吗?那么你对这个结果做了什么呢?它很有效,非常感谢。如果这是真的,我强制编码到那个编码,工作很好,谢谢