温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java Unicode统一码怎么处理

发布时间:2026-08-08 01:09:07 来源:亿速云 阅读:97 作者:小樊 栏目:编程语言

在 Java 里处理 Unicode(统一码),核心要理解 Java 内部全部使用 UTF-16 表示字符,以及 源码 / 文件 / 网络 / 数据库 的编码问题。下面从常见场景系统说明。


一、Java 与 Unicode 的基本事实

1️⃣ Java 的 charString 都是 UTF-16

  • char:16 位,表示一个 UTF-16 代码单元
  • String:底层是 char[]
  • Unicode 码点(code point):U+0000 ~ U+10FFFF

⚠️ 注意:

  • 基本多文种平面(BMP)U+0000 ~ U+FFFF → 一个 char
  • 补充平面(如 Emoji)U+10000 以上 → 两个 char(代理对)

二、字符与 Unicode 的转换

1️⃣ 字符 ↔ Unicode 码点

char c = '中';
int codePoint = c;          // 20013
System.out.println(codePoint);

// Unicode 转字符
char ch = (char) 20013;
System.out.println(ch);    // 中

2️⃣ 字符串中的 Unicode 转义

String s = "\u4e2d\u6587"; // 中文
System.out.println(s);

✅ Java 编译器会在编译阶段把 \uXXXX 转成对应字符。


三、处理补充平面(Emoji / 生僻字)

1️⃣ 遍历正确的 Unicode 码点

❌ 错误方式(会拆散 Emoji):

for (int i = 0; i < s.length(); i++) {
    char c = s.charAt(i);
}

✅ 正确方式:

for (int i = 0; i < s.length(); ) {
    int codePoint = s.codePointAt(i);
    System.out.println(Integer.toHexString(codePoint));
    i += Character.charCount(codePoint);
}

或使用 API:

s.codePoints().forEach(cp ->
    System.out.println(Integer.toHexString(cp))
);

四、字符串与 byte[](编码/解码)

这是 最容易出现乱码的地方

1️⃣ String → byte[](编码)

byte[] bytes = "中文".getBytes(StandardCharsets.UTF_8);

2️⃣ byte[] → String(解码)

String s = new String(bytes, StandardCharsets.UTF_8);

❌ 不推荐:

"中文".getBytes(); // 依赖平台默认编码

✅ 始终显式指定 UTF-8


五、文件 / 网络 / 数据库的 Unicode 处理

1️⃣ 文件读写(UTF-8)

Files.writeString(
    Paths.get("a.txt"),
    "中文",
    StandardCharsets.UTF_8
);

String s = Files.readString(
    Paths.get("a.txt"),
    StandardCharsets.UTF_8
);

2️⃣ 网络传输(HTTP)

request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");

3️⃣ 数据库

  • 数据库、表、字段:UTF-8(MySQLutf8mb4
  • JDBC URL:
jdbc:mysql://localhost/db?useUnicode=true&characterEncoding=UTF-8

六、常见 Unicode 问题总结

问题 原因 解决
Emoji 被截断 用 charAt 用 codePoint
乱码 byte ↔ String 编码不一致 统一 UTF-8
文件乱码 Reader/Writer 未指定编码 指定 UTF-8
数据库乱码 非 UTF-8 utf8mb4

七、实用工具方法示例

判断是否是 Emoji(补充平面)

boolean isSupplementary(int cp) {
    return cp > 0xFFFF;
}

Unicode 码点转 \u 形式

String toUnicode(int cp) {
    return String.format("\\u%04X", cp);
}

八、一句话总结

Java 内部永远用 UTF-16,对外永远用 UTF-8,处理字符串时优先使用 codePoint,而不是 char。

如果你有具体场景(文件、网络、正则、Emoji、序列化、JSON、数据库),可以告诉我,我可以给更针对性的示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI