Java 以UTF-8从键盘读取

Java 以UTF-8从键盘读取,java,Java,我需要读取用户的输入,并且我希望支持非拉丁字母,如Å、Ä和Ö BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in)); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out, "UTF-8"), true); out.println(keyboard.readLine()); out.println("Read w

我需要读取用户的输入,并且我希望支持非拉丁字母,如Å、Ä和Ö

BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out, "UTF-8"), true);
out.println(keyboard.readLine());
out.println("Read with charset: " + Charset.defaultCharset().name());
当我运行这段代码并输入一个拉丁字母时,它会按预期工作(我输入一些东西,按enter键,它会打印出我输入的内容)。但如果我尝试使用å,我会得到:

å

�
Read with charset: UTF-8
如果文本以非拉丁字母结尾,我必须按enter键两次,然后它就不能正确显示它们。我曾在Netbeans的控制台和Windows命令提示符中尝试过,但都没有给出预期的结果


我找不到UTF-8的解决方案,但选择了ISO-8859-1。当我第一次运行
chcp 28591
时,它与我的Netbeans控制台(当然应该是UTF-8)和CMD一起工作,更改了字体(对我来说这是必要的)并运行了我的程序。

您尝试过:

BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in,"UTF-8"));

如果这不起作用,请尝试读取原始字节流,然后将其转换为新字符串(字节,“UTF-8”)

代码示例没有以任何方式正确编码。它使用系统默认值从控制台读入数据,然后使用UTF-8将其写出。您的系统默认值可能不是UTF-8,更复杂的是,您的控制台可能与系统默认值相同,也可能不同


要在控制台中正确执行此操作,您需要使用控制台编码读入,并使用控制台编码写出。例如,如果您正在测试此功能,并且需要将其写入文件,请将其写入UTF-8,并确保使用文本编辑器以UTF-8的形式打开。

它对我有效。您的控制台必须设置为不能正确显示UTF-8。@Real怀疑论者,我可以打印出非拉丁字符,没有问题(Sys.out.print(“å”))。这在Netbeans控制台和CMD中都可以正常工作。但当我尝试读取字符时,问题就出现了(当文本以åä或ö结尾时,必须按enter键两次)。这可以告诉您控制台设置为什么字符集。@realponsum:Z=90,Å=197。但是我认为BufferedReader的底层读取器(?)使用默认的字符集(如上图所示,对我来说是UTF-8)。netbeans控制台是UTF-8,除非netbeans有bug。但是我找到了一个解决方法(检查我更新的问题)。如果你没有指定一个字符集,那么它将使用默认的字符集(在我的例子中是UTF-8,正如你在我的问题中看到的)。我也尝试了你的其他建议,读取原始字节,但没有成功。不过我找到了一个解决办法(改用ISO-8859-1)。真不敢相信它使用的是ISO-8859-1而不是UTF-8。我认为UTF-8现在是相当标准的,但也许不是。