java - 下载不同编码的在线文本

标签 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();
                    }

最佳答案

由于您有多种可能的编码,并且您不知道哪种编码是正确的,因此您别无选择,只能在此处使用 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 开始)。

关于java - 下载不同编码的在线文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31381697/

相关文章:

android - Unity更新到编辑器2021.3.4f1后无法构建

delphi - 如何在Delphi 2009中将UTF-8字符串转换为PChar

vim - 如何正确设置 vim 以进行 utf-8 编辑

java - 如何验证 YAML on Play 中没有重复条目?

java - 测试对象是否是参数类型的实例

android - 在 OpenGL-ES 2.0 中渲染多个 2D 图像

python - 无法打开包含西里尔符号的 Python 编码 URL

java - Spring RestClient 内容类型不匹配

java - (JUNIT/Spring 3.2) 未找到线程绑定(bind)请求 : Are you referring to request attributes outside of an actual web request

android - Android SwitchCompat 的垂直对齐方式?