You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将重音字符编码为UTF-8且不丢失其字符表示?

解决Java字符串转UTF-8编码时的乱码问题

你的代码出现乱码是因为处理UTF-8字节的方式存在两处关键错误:

  • ByteBuffer.array()会返回缓冲区的底层完整数组,其中包含未被使用的空字节,这些字节会被误解析为无效字符(�)。
  • 直接使用new String(byte[])构造字符串时,JVM会采用默认字符集解析字节,而非指定的UTF-8,导致特殊字符解码错误。

正确实现方式

如果你的需求是将字符串转换为UTF-8编码的字节数组,再重新构建为正确的字符串,可使用以下代码:

public static void test() throws IOException {
    String input = "ABCÉ Ôpqr";
    // 将字符串转换为UTF-8编码的字节数组
    byte[] utf8Bytes = input.getBytes(StandardCharsets.UTF_8);
    // 用UTF-8字符集解析字节数组,重建字符串
    String utf8String = new String(utf8Bytes, StandardCharsets.UTF_8);
    // 输出结果
    System.out.printf("Output : \"%s\" Encoding : UTF-8%n", utf8String);
}

如果需要直接输出或写入UTF-8编码的内容(比如到控制台或文件),更推荐使用字符流指定编码:

public static void test() throws IOException {
    String input = "ABCÉ Ôpqr";
    // 使用OutputStreamWriter指定UTF-8编码输出
    try (OutputStreamWriter writer = new OutputStreamWriter(System.out, StandardCharsets.UTF_8)) {
        writer.write(String.format("Output : \"%s\" Encoding : UTF-8%n", input));
        writer.flush();
    }
}

错误代码分析

原代码中StandardCharsets.UTF_8.encode(input)生成的ByteBuffer确实包含了UTF-8格式的字节,但缓冲区的容量通常大于实际有效字节数,调用array()会返回整个缓冲区(包括末尾的空字节)。同时,new String(byte[])未指定字符集,JVM会用默认编码解析这些字节,最终导致特殊字符丢失、出现乱码。

内容的提问来源于stack exchange,提问作者ankush chauhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 17:52:32