请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

charset.encode返回结果的疑问

按照老师给出的思路,写了用长度有限的Buffer去循环处理中文乱码,在调试过程中发现一个奇怪的事,就是“长坂桥头杀气生,横枪立马眼圆睁。一声好似轰雷震,独退曹家百万兵。”这句话生产的字节数组长达143字节,而且最后有若干个0,比较奇怪。

图片描述
图片描述
虽然这么多的0不影响最终结果的输出,但是对这个0比较有疑问

正在回答

2回答

求老仙 2021-03-10 23:32:14

麻烦再确认下,看上去是buffer没有用完。

1 回复 有任何疑惑可以回复我~
  • 提问者 慕粉4331336 #1
    上面的截图是charset.encode("长坂坡...").array()的返回结果
    回复 有任何疑惑可以回复我~ 2021-03-10 23:34:22
  • 求老仙 回复 提问者 慕粉4331336 #2
    查了下源代码,因为java是在不断尝试分配内存转码。每次乘2,冗余系数1.1。感兴趣看下charsetencoder的源代码,见encode函数。
    回复 有任何疑惑可以回复我~ 2021-03-10 23:50:59
  • 提问者 慕粉4331336 回复 求老仙 #3
    棒,谢老仙,我去理解下
    回复 有任何疑惑可以回复我~ 2021-03-10 23:55:19
求老仙 2021-03-10 23:53:16

分析下:JVM的开发团队不想为每个CharSet都编写一套算法,于是每个字符到底对应几个byte是不确定的,只有一个个转义。 于是就有了下面这段不断分配的程序。 

 public final ByteBuffer encode(CharBuffer in)
       throws CharacterCodingException
   {
       int n = (int)(in.remaining() * averageBytesPerChar());
       ByteBuffer out = ByteBuffer.allocate(n);

       if ((n == 0) && (in.remaining() == 0))
           return out;
       reset();
       for (;;) {
           CoderResult cr = in.hasRemaining() ?
               encode(in, out, true) : CoderResult.UNDERFLOW;
           if (cr.isUnderflow())
               cr = flush(out);

           if (cr.isUnderflow())
               break;
           if (cr.isOverflow()) {
               n = 2*n + 1;    // Ensure progress; n might be 0!
               ByteBuffer o = ByteBuffer.allocate(n);
               out.flip();
               o.put(out);
               out = o;
               continue;
           }
           cr.throwException();
       }
       out.flip();
       return out;
   }

  

1 回复 有任何疑惑可以回复我~
  • poxige #1
    1. 那这个场景下是不是用 raw.getBytes(charset); 更好处理?这个返回的是byte[]长度是96,那charset.encode(raw) 什么时候用,有什么优势
    
    2. 如果用 charset.encode(raw) 来读取,对于这些 0 要怎么判断? 是碰到0就意味着往后的位置不会有数据,可以认为处理结束  return 了么。 (即意味着对于字符串的 byte[] 中间不可能出现0对吧)
    回复 有任何疑惑可以回复我~ 2022-08-27 11:53:03
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信