下载不同编码的在线文本

Posted

技术标签:

【中文标题】下载不同编码的在线文本【英文标题】:Downloading online text with different encodings 【发布时间】:2015-10-01 14:51:03 【问题描述】:

我正在下载在线文本,可以由用户上传,所以文本可以是 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】:

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

【讨论】:

我需要在没有像 Guava 这样的外部第三方库的情况下实现这一目标 如何使用你的功能?请给我一个参数调用的例子 好的,我尝试了 isCharset(Charset.forName("ISO-8859-1"), buffer.toByteArray()) ,它似乎正在工作,现在我必须检查每个可能的字符集,直到我找到a true 然后将字符串解析为该字符集? 那么,嗯,你的意思是你真的想要字符串结果吗?那么你会如何处理这个结果呢? 它有效,非常感谢。如果是真的,我强制编码为该编码,并且工作正常,谢谢

以上是关于下载不同编码的在线文本的主要内容,如果未能解决你的问题,请参考以下文章

我可以在其中找到编码为不同质量的 h.264 视频样本。

如何实现 qt 中qfile写出的文本 设置为unicode编码 在线等 谢谢。。。

JAVA里的编码转换,懂的进来看看!!!!!

调用支付宝PHP接口API实现在线即时支付功能(UTF-8编码)转

Haskell:在 ByteStrings 和不同的文本编码之间进行转换

Base64编码