我正在尝试使用 System.out 编写 unicode 字符 (♠),而是打印了一个问号。
如何显示正确的 unicode 字符而不是问号?
我在 Windows 上使用 IntelliJ IDEA,并尝试从 IDE 中打印。
我正在尝试使用 System.out 编写 unicode 字符 (♠),而是打印了一个问号。
如何显示正确的 unicode 字符而不是问号?
我在 Windows 上使用 IntelliJ IDEA,并尝试从 IDE 中打印。
转到Help>Edit Custom VM options...然后添加以下选项:
-Dconsole.encoding=UTF-8
-Dfile.encoding=UTF-8
我不确定两者是否都是必要的,但它对我有用。您需要重新启动 IntelliJ 才能应用更改。
我已经尝试过更改 Intellij 中的每个编码设置,在 Gradle 中设置这些选项并更改系统编码,这是唯一有效的方法。
TL;DR 答案:
转到Settings
-> Editor
-> File Encodings
->Project Encoding
并将其设置为“UTF-8”。
扩展答案:
System.out.print()
通过在调用上放置断点可以找到它不起作用的原因。当断点命中时,您可以添加System.out
to Watches
,您可以看到它System.out.textOut.out.se.cs
设置为windows-1252
或类似的不合适的东西。
神奇地为我工作的设置(我不知道为什么)在Settings
-> Editor
-> File Encodings
->Project Encoding
中。您需要将其设置为“UTF-8”。
然后,unicode 字符在控制台上正确显示,使用调试器再快速查看一下,发现 的值System.out.textOut.out.se.cs
神奇地变成了UTF-8
.
我说“神奇”是因为我看不出编辑器设置如何以及为什么会影响System.out
启动/调试应用程序时实例化的字符集。如果有人知道这背后的逻辑是什么,请告诉!
文件编码是否配置正确?请参阅“设置 | 文件编码”使用 UTF-8。当我有 IDE 编码并且所有文件都设置为 UTF-8 时,打印 ♠ 对我有用。更改编码后可能需要重新编译。
System.out 使用底层操作系统的默认编码,通常是 ISO-8859-1 或 UTF-8。第一个是我在 XP 下的 1252 代码页。
这是在 CMD.EXE 窗口中还是在 IDE 中?
如果您最终想在 Windows 上的标准命令行上打印各种 Unicode 字符,则需要做一些工作。默认光栅字体不支持字符,应用程序通常需要调用 Unicode 控制台 API 来呈现它们。Java 不会 - 它会首先将字符编码为本机字符集(一个有损过程),然后使用 ANSI 调用发出它们。如果你想要血淋淋的细节,你可以阅读这篇博文。
设置未正确配置,请确保您的文件编码设置为 UTF-8,尤其是“默认编码属性文件”。在我这边,在我更改默认编码之前,以下步骤不起作用。
关于 Intellij 2017.3.1(社区版)文件 | 设置 | 编辑器 > 文件编码。点击下面的链接查看设置图片
您的机器上是否安装了适当的字体?当您输出的字符没有字体时,会出现问号。
另外,您是否通过执行输出System.out.println("<your string>")
?如果是这样,只需安装字体即可。
如果您尝试System.out
从程序中写入,那就不同了。你必须使用OutputStreamWriter
一个字符流。您不能只写入面向字节的流,例如OutputStream
.
查找 API 和类参考OutputStreamWriter
以及子类,例如PrintWriter
. 您构造它并给出构造函数的语言环境。例如,
PrintWriter pw = new PrintWriter(System.out, "UTF-8");