它再次进行了字符串转换:UNIX Windows-1252到String

时间:2015-03-30 20:16:05

标签: java string unix encoding

我正在使用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文件打开我要在此处打印的内容时,它会显示(位于右下角)UNIXWindows-1252。这就是我所知道的编码文件。

我还可以采取哪些措施来找出问题所在?

- AND -

如何转换此文件以便我可以用Java正确阅读和打印?

很抱歉,如果这个问题有点愚蠢......我根本就不知道更好,在互联网上找不到任何东西。

1 个答案:

答案 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。