又是String转换:UNIX Windows-1252 to String

It's the String conversion again: UNIX Windows-1252 to String

我正在 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。这就是我对编码文件的全部了解。

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

--和--

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

抱歉,如果这个问题有点愚蠢...我只是不知道更好,也无法在互联网上找到任何东西。

好的,所以你在这里混合了很多东西。

首先,你做:

new InputStreamReader(myUrl.openStream())

这将打开一个 reader,是的;但是,它将使用您的 默认值 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
}

现在,你在混合什么...

您阅读了 InputStreamInputStream 只知道如何阅读 bytes.

但是你想要文字;在 Java 中,文本表示 char 的序列。

让我们暂时忘记您想要 chars 并专注于您想要文本这一事实;让我们用 char 代替信鸽。

现在,您需要做的是将这个字节流转换为信鸽流。为此,您需要一个特定的过程。在这种情况下,该过程称为 decoding.

现在回到Java。还存在一个相反的过程:编码信鸽流(或chars)为字节流。

诀窍...有几种方法可以做到这一点; Unicode 将它们称为 character codings;在 Java 中,提供 编码器 解码器 的基础 class 是 Charset.

现在,InputStreamReader 接受 Charset 作为第二个参数...您应该始终指定它。如果你不这样做,这:

new InputStreamReader(in);

将等同于:

new InputStreamReader(in, Charset.defaultCharset());

Charset.defaultCharset() 不是。保证。到。是。这。相同的。其中。实施。的。 JREs.