Java中Unicode与中文互转本质是码点映射:编译期字面量(如"u4f60")由编译器自动转为“你好”;运行时字符串(如"u4f60")需用StringEscapeUtils.unescapeJava()或正则手动解码。

Java 中 Unicode 字符和中文字符的互相转换,本质是处理 Unicode 码点(如 U+4F60)与 Java char 或 String 之间的映射关系。关键区别在于:编译期字面量自动解析 vs 运行时字符串手动解码。
Unicode 字符串字面量 → 中文(编译期自动完成)
当你在源码中直接写 "u4f60u597d",Java 编译器会在编译阶段将其转为实际字符“你好”。这是最简单、最可靠的方式:
-
u后必须紧跟且仅限 4 位十六进制数字(a–f或A–F),例如u4F60合法,u4f6或u4f600会报错 - 该机制只适用于硬编码的字符串字面量,不适用于从文件、JSON、控制台或网络读入的字符串
- 常见误写:
"u4f60"(缺反斜杠)或"\u4f60"(双反斜杠被当作文本)都不会触发自动解析
运行时字符串中的 "uXXXX" → 中文(需手动解码)
如果字符串是动态获取的,比如 "u4f60u597d"(注意这里是两个反斜杠,表示字面量 `u`),就必须用代码解析。推荐两种方式:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
-
用 Apache Commons Text(推荐):引入
commons-text依赖后,调用StringEscapeUtils.unescapeJava(s)即可,支持混合内容(如"Hi \u4f60\u597d! \u2605") -
无依赖正则替换:用
Pattern.compile("\\u([0-9a-fA-F]{4})")匹配,对每组提取的 4 位十六进制调用Integer.parseInt(hex, 16)转为char,再拼接。注意正则中要写\\u才能匹配字符串里的u
中文字符 → Unicode 编码字符串(如 "u4f60")
将中文转成 uXXXX 形式的字符串,常用于生成可移植的源码或调试输出:
立即学习“Java免费学习笔记(深入)”;
- 对每个字符
c,用String.format("\u%04x", (int) c)可得小写格式;用%04X得大写 - 若需兼容代理对(如 emoji 或生僻汉字),应使用
Character.codePointAt()遍历码点,再格式化;普通中文(U+4E00–U+9FFF)用char直接强转即可 - 避免用
String.getBytes("unicode")—— 它返回的是 UTF-16BE 带 BOM 的字节数组,不是标准u序列
注意编码环境与乱码陷阱
转换结果正确 ≠ 控制台/文件显示正常。很多“转换失败”其实是显示层问题:
- IDE 或 Windows 命令行默认编码不是 UTF-8,会导致
System.out.println输出乱码,但字符串本身是正确的 - 读取 properties 文件、JSON 或 HTTP 响应时,确保输入流已按 UTF-8 解码,否则拿到的是错误字节,后续解码无意义
- 数据库连接需显式指定
useUnicode=true&characterEncoding=UTF-8,否则 JDBC 可能用平台默认编码解析

















