【问题标题】:Read from keyboard in UTF-8以 UTF-8 从键盘读取
【发布时间】:2015-03-07 16:13:33
【问题描述】:

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

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 一起工作,更改了字体(在我的情况下这是必要的)并运行我的程序。

【问题讨论】:

  • 它对我有用。您的控制台必须设置为不能正确显示 UTF-8。
  • @RealSkeptic,我可以打印出非拉丁字符,没问题(Sys.out.print("å"))。这在 Netbeans 控制台和 CMD 中都可以正常工作。但是,当我尝试阅读字符时,就会出现问题(当文本以 å ä 或 ö 结尾时,必须按两次 Enter)。
  • 尝试从 System.in 中读取 bytes 并打印它们。这可以告诉您控制台设置的字符集。
  • @RealSkeptic: Z = 90, Å = 197。但我认为 BufferedReader 的底层阅读器(?)使用默认字符集(如上所示,对我来说是 UTF-8) .

标签: java


【解决方案1】:

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

要在控制台中正确执行此操作,您需要使用控制台编码读入,并使用控制台编码写出。例如,如果您只是对此进行测试并需要写入文件,请将其写入为 UTF-8,并确保使用文本编辑器将其打开为 UTF-8。

【讨论】:

  • netbeans 控制台是 UTF-8,除非 Netbeans 存在错误。我找到了一个解决方法(检查我更新的问题)。
【解决方案2】:

你试过了吗:

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

如果这不起作用,请尝试读取原始字节流,然后转换为 new String(bytes,"UTF-8")

【讨论】:

  • 如果您不指定字符集,那么它将使用默认字符集(在我的情况下是 UTF-8,正如您在我的问题中看到的那样)。我也尝试了阅读原始字节的其他建议,但没有成功。不过我找到了一种解决方法(改用 ISO-8859-1)。
  • 不敢相信它使用的是 ISO-8859-1 而不是 UTF-8。我认为 UTF-8 现在很标准,但也许不是。
猜你喜欢
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 2017-06-28
  • 1970-01-01
相关资源
最近更新 更多