困惑——字符串编码转码后,在控制台时打印多出了异常字符

2022-07-19 10:27:16 +08:00
 cs419

环境 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 个菱形问号
控制台下 这个空格显示为方形中有个斜杠

756 次点击
所在节点    Java
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);

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/867200

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX