Java中Unicode转中文分编译期自动解析和运行时手动解码:源码中“u4f60u597d”由编译器直接转为“你好”;动态字符串需用Apache Commons Text的StringEscapeUtils.unescapeJava()或正则匹配十六进制手动转换。

Java 中将 Unicode 编码(如 u4f60u597d)转换为可读中文,本质是让 Java 正确解析转义序列。关键在于:这些 Unicode 转义必须在字符串字面量中以 uXXXX 形式出现,由编译器在编译期自动处理;如果它们是以普通字符串(比如从文件、网络或用户输入中读取的 "\u4f60\u597d")形式存在,则需要手动解码。
编译期自动解析(最常见、最简单)
当你直接在 Java 源码中写字符串字面量时,只要格式正确,JVM 会在编译时自动完成转换:
-
String s = "u4f60u597d";→ 运行时就是"你好" - 注意:
u后必须紧跟 4 位十六进制数字(大小写均可),不能少或多 - 这种写法只适用于硬编码,不适用于运行时动态获取的字符串
运行时手动解码(处理动态字符串)
如果 Unicode 是以普通字符串形式存在(例如 "u4f60u597d" 或 "u4F60u597D"),需用代码解析。推荐使用 Apache Commons Text(更安全稳定):
- 添加依赖(Maven):
<dependency><br> <groupId>org.apache.commons</groupId><br> <artifactId>commons-text</artifactId><br> <version>1.12.0</version><br></dependency>
- 解码示例:
String decoded = StringEscapeUtils.unescapeJava("\u4f60\u597d"); // 返回 "你好" - 支持混合内容,如
"Hello \u4f60\u597d! \u2605"也能正确处理
不依赖第三方库的手动实现(适合轻量场景)
若不想引入外部依赖,可用正则匹配 + Integer.parseInt(..., 16) 手动替换:
立即学习“Java免费学习笔记(深入)”;
- 用正则
\\u([0-9a-fA-F]{4})匹配每个uXXXX - 对每组匹配提取 4 位十六进制,转成 int,再强转为
char - 拼接成新字符串(注意:代理对需额外处理,但常用中文基本字符都在 BMP 平面,
char可直接表示) - 示例片段:
String input = "\u4f60\u597d";<br>String result = input.replaceAll("\\u([0-9a-fA-F]{4})",<br> m -> String.valueOf((char) Integer.parseInt(m.group(1), 16)));<br>// 得到 "你好"
常见误区提醒
容易出错的地方往往不在逻辑,而在细节:
- 误把
"u4f60"写成"\u4f60"—— 前者是合法转义,后者是字面量反斜杠加 u,不会被编译器识别 - 从 JSON、Properties 或控制台读入的字符串默认不含编译期转义能力,必须走运行时解码
- Windows 命令行或某些 IDE 控制台可能因编码设置显示乱码,实际字符串内容正确,建议用
System.out.println(s.length())或调试器验证


















