charset.encode返回结果的疑问

来源:2-11 深入Buffer-Coding-阿里面试题:中文乱码处理和大文件词频统计(1)

慕粉4331336

2021-03-10

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

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

写回答

2回答

求老仙

2021-03-10

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

1
5
慕粉4331336
回复
求老仙
OK,有注释好理解多了
2021-03-11
共5条回复

求老仙

2021-03-10

分析下: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
1
poxige
1. 那这个场景下是不是用 raw.getBytes(charset); 更好处理?这个返回的是byte[]长度是96,那charset.encode(raw) 什么时候用,有什么优势 2. 如果用 charset.encode(raw) 来读取,对于这些 0 要怎么判断? 是碰到0就意味着往后的位置不会有数据,可以认为处理结束 return 了么。 (即意味着对于字符串的 byte[] 中间不可能出现0对吧)
2022-08-27
共1条回复

笑傲Java面试 剖析大厂高频面试真题 秒变offer收割机

深度剖析大厂面试高频真题,让你秒变offer收割机

1783 学习 · 314 问题

查看课程