如何将重音字符编码为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
相关产品推荐
相关产品推荐

