【发布时间】:2019-07-14 14:39:55
【问题描述】:
如您所知,InputStreamReader 将读取提供的InputStream 并将其字节解码为字符。如果没有指定charset,它将使用默认字符集。
我们可以用java.nio.charset.Charset.defaultCharset().displayName()检查这个默认字符集。
案例 1。我的 Windows CMD 使用 cp850,但 Java 报告 windows-1252。可以证明键入字符ó 和System.in.read() 将按预期报告162。但是,InputStreamReader 将无法对其进行解码,因为它预计将运行 windows-1252,显示 ¢(这是第 162 个 windows-1252 字符)。
案例 2。在 Windows 中,我的 Netbeans 集成终端使用 windows-1252,但 Java 报告 UTF-8。同样,可以证明键入字符ó 和System.in.read() 将按预期报告243。但是,InputStreamReader 将无法对其进行解码,因为它预计将运行UTF-8,显示�(代码65533)。
案例 3。我的 Debian 机器在 GNOME 和 Netbeans 终端中到处都使用UTF-8。当键入字符 ó 时,System.in.read() 将报告两个字节,195 和 161,它们对应于该字符的 UTF-8 表示。 InputStreamReader 将按预期显示 ó。
我想要什么? 有没有办法正确检测所使用的 实际 字符集,以便我可以从命令行读取字符(在 Windows CMD 和 Windows 中的 Netbeans 中)没有特殊情况?
非常感谢。
B 计划:案例 2 可以通过 changing Netbeans file encoding to UTF-8 解决(它也将处理 UTF-8 文件,这是 IDE 在 2019 年应该做的)。案例 1 可以通过将代码页更改为 UTF-8 来解决,但我无法做到这一点。
您可以使用以下程序来测试这些情况。输入两次相同的字符并比较输出。
import java.io.*;
import java.nio.charset.Charset;
public class Prova2 {
public static void main(String[] args) throws Exception {
int b;
System.out.println("Charset.defaultCharset: " + Charset.defaultCharset().displayName());
System.out.println("I will read the next bytes: ");
while ((b = System.in.read()) != '\n') {
System.out.println("I have read this byte: " + b + " (" + (char) b + ")");
}
System.out.println("I will read the next chars: ");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while ((b = br.read()) != '\n') {
System.out.println("I have read this char: " + b + " (" + (char) b + ")");
}
System.out.println("Thank you.");
}
}
【问题讨论】:
-
由于
defaultCharset()返回“此Java 虚拟机的默认字符集”,“正确检测实际使用的字符集” 的方式将要明确指定 JVM 何时启动,但这似乎并不简单。对此有很多 SO 问题(例如Setting the default Java character encoding?),但它们已经过时,因此可能值得研究当前情况。另请参阅旧的 JDK 错误 JDK-5052844 : file.encoding parameter ignored on Intel Linux。 -
嗯,是的,理想情况下我会自动检测到它。不过,谢谢!
标签: java windows netbeans encoding utf-8