V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cs419
V2EX  ›  Java

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

  •  
  •   cs419 · 2022-07-19 10:27:16 +08:00 · 712 次点击
    这是一个创建于 618 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    meanmachine
        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);
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5511 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 09:05 · PVG 17:05 · LAX 02:05 · JFK 05:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.