我正在使用Java下载一个网站:
myUrl = new URL("here is my URL");
in = new BufferedReader(new InputStreamReader(myUrl.openStream()));
在这个文件中,有一些特殊字符,如ä,ö和ü。我需要能够正确打印出来。
我尝试使用以下代码对字符串进行编码:
String encodedString = new String(toEncode.getBytes("Windows-1252"), "UTF-8");
但它只是用?
替换这些特殊字符。
当我使用带有Notepad ++的Chrome下载的.html文件打开我要在此处打印的内容时,它会显示(位于右下角)UNIX
和Windows-1252
。这就是我所知道的编码文件。
我还可以采取哪些措施来找出问题所在?
- AND -
如何转换此文件以便我可以用Java正确阅读和打印?
很抱歉,如果这个问题有点愚蠢......我根本就不知道更好,在互联网上找不到任何东西。
答案 0 :(得分:2)
好的,所以你在这里混合很多东西。
首先,你这样做:
new InputStreamReader(myUrl.openStream())
这将打开一个读者,是的;但是,它将使用您的默认JRE / OS Charset
来实现。也许不是你想要的。
尝试并指定您想要UTF_8(注意,Java 7+代码):
try (
final InputStream in = myUrl.openStream();
final Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8);
) {
// read from the reader here
}
现在,你在混什么......
您从InputStream
读取; InputStream
只知道如何阅读byte
s。
但你想要文字;在Java中,text表示char
s。
让我们暂时忘记你想要char
并关注你想要文本的事实;让我们用char
代替一只信鸽。
现在,您需要做的是将此字节流转换为载体流的流。为此,您需要一个特定的过程。在这种情况下,该过程称为解码。
现在回到Java。还存在一个反向的过程:编码载体鸽子流(或char
s)到字节流中。
诀窍......有几种方法可以做到这一点; Unicode将它们称为character codings
;在Java中,提供编码器和解码器的基类是Charset
。
现在,InputStreamReader
接受Charset
作为第二个参数......您应该总是指定。如果你不这样做,那就:
new InputStreamReader(in);
将等同于:
new InputStreamReader(in, Charset.defaultCharset());
和Charset.defaultCharset()
不是。保证。至。是。的。相同。当中。实现。的。的JRE。