本文详解 Java 中打印日文颜文字(如 (。•́︿•̀。))出现乱码(如 ᄑᄀ¬タ꼬チ…)的根本原因,并提供从源码编码、编译配置到终端支持的全流程解决方案。
本文详解 java 中打印日文颜文字(如 `(。•́︿•̀。)`)出现乱码(如 `ᄑᄀ¬タ꼬チ…`)的根本原因,并提供从源码编码、编译配置到终端支持的全流程解决方案。
在 Java 中直接使用 System.out.print("(。•́︿•̀。)"); 却输出类似 (ᄑᄀ¬タ꼬チᄌ¬タ꼬タᄑᄀ) 的异常字符,并非代码逻辑错误,而是字符编码不匹配导致的典型问题。其本质在于:Java 源文件中包含的 Unicode 字符(如全角平假名、组合变音符号、Kaomoji 等)需以特定编码(如 UTF-8)持久化为字节序列;而编译器若未获知该编码方式,便会按默认(如 Windows 平台的 GBK 或 Cp1252)错误解析字节流,最终将多字节 UTF-8 序列误拆为多个无效单字节字符——这正是乱码 ᄑᄀ 等“替换字符”(U+FFFD 的显示变体)的来源。
✅ 正确做法:三步确保 Unicode 字符端到端正确处理
1. 确保源文件以 UTF-8 编码保存
这是前提。在主流编辑器或 IDE 中检查并设置:
- VS Code:右下角点击编码名称 → 选择 “Save with Encoding” → UTF-8
- IntelliJ IDEA / Eclipse:File → Settings → Editor → File Encodings → 将 Global Encoding、Project Encoding 和 Default encoding for properties files 均设为 UTF-8,并勾选 Transparent native-to-ascii conversion(可选,不影响 Kaomoji)
- 记事本(Windows):另存为 → 编码选择 UTF-8(勿选 UTF-8-BOM,BOM 可能干扰 Java 编译)
2. 显式指定 javac 编译编码
即使源文件是 UTF-8,旧版 JDK(尤其是 Windows 下)默认使用系统编码(如 GBK),必须显式告知编译器:
javac -encoding UTF-8 MyEmojiPrinter.java java MyEmojiPrinter
⚠️ 注意:-encoding 必须放在 javac 命令最前面或紧邻 javac 后,且大小写敏感(UTF-8 中连字符不可省略)。
立即学习“Java免费学习笔记(深入)”;
3. 验证运行环境终端支持 UTF-8
编译通过后,若控制台仍显示方块或问号,说明终端本身不支持 UTF-8 渲染:
- Windows CMD/PowerShell:执行 chcp 65001 切换至 UTF-8 代码页(临时生效);推荐改用 Windows Terminal,默认启用 UTF-8
- macOS/Linux 终端:通常默认 UTF-8,可通过 locale | grep UTF-8 验证;若异常,检查 ~/.bashrc 或 ~/.zshrc 中是否设置了 export LANG=en_US.UTF-8
- IDE 内置终端:IntelliJ/Eclipse 默认使用系统 locale,但可在 Settings → Tools → Terminal 中设置启动命令(如 macOS 加 export LANG=en_US.UTF-8)
✅ 完整可运行示例
// MyEmojiPrinter.java —— 请确保此文件以 UTF-8 无 BOM 格式保存
public class MyEmojiPrinter {
public static void main(String[] args) {
System.out.println("(。•́︿•̀。)"); // 日文 Kaomoji
System.out.println("こんにちは?"); // 日文 + Emoji
System.out.println("???"); // 纯 Emoji(需终端支持)
}
}✅ 正确编译与运行后,应清晰输出:
(。•́︿•̀。) こんにちは? ???
❗关键注意事项
- 不要尝试转义 Kaomoji:(\。\•́\︿\•̀\。) 是错误思路——Java 字符串字面量中,•́ 是 Unicode 字符(U+2022 + U+0301),非特殊符号,无需反斜杠;非法转义反而触发编译错误。
- 避免 BOM(Byte Order Mark):UTF-8 文件若含 BOM(EF BB BF),部分 JDK 版本可能报错 illegal character: '\ufeff'。务必保存为 UTF-8 without BOM。
- IDE 自动配置优先级更高:Maven/Gradle 项目需同步配置 maven-compiler-plugin 的 <encoding>UTF-8</encoding>,否则 IDE 设置可能被构建工具覆盖。
- 控制台限制是最后一环:即使 Java 层完全正确,若终端字体缺失对应字形(如某些等宽字体不支持 Emoji),仍将显示为空白或方块——此时需更换支持 Noto Color Emoji 或 Segoe UI Emoji 的字体。
总结
解决 Java Kaomoji 乱码 = UTF-8 源码保存 + -encoding UTF-8 显式编译 + UTF-8 终端环境 三者缺一不可。核心在于理解:字符 ≠ 字节,编码是桥梁;桥建错了,信息必失真。 掌握这一原则,不仅能修复颜文字,更能从容应对中文、阿拉伯文、数学符号等所有 Unicode 场景。










