使用UTF-8编码输出Emoji却显示问号的Java代码问题
Emoji输出显示问号的问题排查与解决方法
在编写Emoji相关Java代码时,尽管采用UTF-8编码,但输出仅显示问号,相关代码如下:
System.out.print(boyName + ", will you be my boyfriend? "); String response = scanner.nextLine(); switch (response.toLowerCase()) { case "yes": System.out.println("Yay! \uD83D\uDE0A"); break; case "maybe": System.out.println("I'll wait for your decision! \uD83E\uDD14"); break; case "no": System.out.println("\uD83D\uDE22"); break; default: System.out.println("gulo mo, 3 na nga lang pagpipilian"); }
问题原因
- 控制台默认编码非UTF-8:多数Java运行环境的控制台(比如Windows CMD)默认使用GBK等本地编码,无法解析Emoji的UTF-8字符,导致无法识别的字符被替换为问号。
- 标准输出流编码不匹配:
System.out默认采用系统编码,当系统编码不支持Emoji的双字节代理对时,输出异常。 - 控制台字体不支持Emoji:部分老旧或默认字体没有包含Emoji字符集,即使编码正确也无法显示。
解决方法
1. 切换控制台编码为UTF-8
- Windows CMD:运行前执行命令
chcp 65001切换编码至UTF-8,再启动Java程序。 - IDE控制台(IntelliJ IDEA/Eclipse):在运行配置中添加VM参数
-Dfile.encoding=UTF-8,或在IDE全局设置中将编码统一改为UTF-8。
2. 显式指定输出流编码
修改代码,使用UTF-8编码的输出流替代默认的System.out,示例代码如下:
import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.nio.charset.StandardCharsets; import java.util.Scanner; public class EmojiDemo { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String boyName = "YourName"; // 初始化UTF-8编码的输出流 PrintWriter utf8Out = new PrintWriter( new OutputStreamWriter(System.out, StandardCharsets.UTF_8), true ); utf8Out.print(boyName + ", will you be my boyfriend? "); String response = scanner.nextLine(); switch (response.toLowerCase()) { case "yes": utf8Out.println("Yay! \uD83D\uDE0A"); break; case "maybe": utf8Out.println("I'll wait for your decision! \uD83E\uDD14"); break; case "no": utf8Out.println("\uD83D\uDE22"); break; default: utf8Out.println("gulo mo, 3 na nga lang pagpipilian"); } scanner.close(); } }
3. 更换支持Emoji的控制台字体
如果编码设置正确仍显示问号,需将控制台字体更换为支持Emoji的类型,比如Windows的Segoe UI Emoji,或在IDE控制台设置中选择支持Emoji的字体。
内容的提问来源于stack exchange,提问作者francis245
相关产品推荐
相关产品推荐

