环境 jdk 1.8
import java.io.IOException; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; public class Case09 { public static void main(String[] args) throws IOException { String s1 = "农夫\uD83C\uDF7Agg"; // 农夫9966 info(s1); info(convertEncoding(s1, StandardCharsets.UTF_16)); info(convertEncoding("11223344", StandardCharsets.UTF_16)); System.out.println("断点行"); } static String convertEncoding(String str, Charset charset) { ByteBuffer bb = charset.encode(str); return new String(bb.array(), charset); } static void info(String msg) { System.out.print("原文: "); System.out.print(msg); String a = "" + " 大小: " + msg.getBytes().length + " 码元数: " + msg.length() + " 长度: " + msg.codePointCount(0, msg.length()); System.out.println(a); } }
打印结果
原文: 农夫gg 大小:12 码元数:6 长度:5 原文: 农夫gg 大小:20 码元数:12 长度:11 原文: 11223344 大小:18 码元数:16 长度:16 断点行
预期的结果是 转为 utf-16 后
打印的原文 不应该有变化
实际的打印结果是 转码后 控制台打印的字符后面多个了 空格与菱形问号
第 2 行是多了 5 个空格 1 个菱形问号
第 3 行是多了 7 个空格 1 个菱形问号
控制台下 这个空格显示为方形中有个斜杠
![]() | 1 meanmachine 2022-07-19 10:42:56 +08:00 ![]() 传入 String 的 array 长度问题 -- return new String(bb.array(), charset); ++ return new String(bb.array(), 0, bb.remaining(), charset); |