环境 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 1
传入 String 的 array 长度问题
-- return new String(bb.array(), charset); ++ return new String(bb.array(), 0, bb.remaining(), charset); |