下载不同编码的在线文本
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 然后将字符串解析为该字符集? 那么,嗯,你的意思是你真的想要字符串结果吗?那么你会如何处理这个结果呢? 它有效,非常感谢。如果是真的,我强制编码为该编码,并且工作正常,谢谢以上是关于下载不同编码的在线文本的主要内容,如果未能解决你的问题,请参考以下文章
如何实现 qt 中qfile写出的文本 设置为unicode编码 在线等 谢谢。。。
调用支付宝PHP接口API实现在线即时支付功能(UTF-8编码)转