又是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 文件打开我想在这里打印的内容时,它显示(在右下角)UNIX
和 Windows-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
}
现在,你在混合什么...
您阅读了 InputStream
; InputStream
只知道如何阅读 byte
s.
但是你想要文字;在 Java 中,文本表示 char
的序列。
让我们暂时忘记您想要 char
s 并专注于您想要文本这一事实;让我们用 char
代替信鸽。
现在,您需要做的是将这个字节流转换为信鸽流。为此,您需要一个特定的过程。在这种情况下,该过程称为 decoding.
现在回到Java。还存在一个相反的过程:编码信鸽流(或char
s)为字节流。
诀窍...有几种方法可以做到这一点; Unicode 将它们称为 character codings
;在 Java 中,提供 编码器 和 解码器 的基础 class 是 Charset
.
现在,InputStreamReader
接受 Charset
作为第二个参数...您应该始终指定它。如果你不这样做,这:
new InputStreamReader(in);
将等同于:
new InputStreamReader(in, Charset.defaultCharset());
和 Charset.defaultCharset()
不是。保证。到。是。这。相同的。其中。实施。的。 JREs.
我正在 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
。这就是我对编码文件的全部了解。
我还可以采取哪些步骤来找出问题所在?
--和--
如何转换此文件以便我可以在 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
}
现在,你在混合什么...
您阅读了 InputStream
; InputStream
只知道如何阅读 byte
s.
但是你想要文字;在 Java 中,文本表示 char
的序列。
让我们暂时忘记您想要 char
s 并专注于您想要文本这一事实;让我们用 char
代替信鸽。
现在,您需要做的是将这个字节流转换为信鸽流。为此,您需要一个特定的过程。在这种情况下,该过程称为 decoding.
现在回到Java。还存在一个相反的过程:编码信鸽流(或char
s)为字节流。
诀窍...有几种方法可以做到这一点; Unicode 将它们称为 character codings
;在 Java 中,提供 编码器 和 解码器 的基础 class 是 Charset
.
现在,InputStreamReader
接受 Charset
作为第二个参数...您应该始终指定它。如果你不这样做,这:
new InputStreamReader(in);
将等同于:
new InputStreamReader(in, Charset.defaultCharset());
和 Charset.defaultCharset()
不是。保证。到。是。这。相同的。其中。实施。的。 JREs.