Ume*_*esh 8 java character-encoding
byte[] byteArray = Charset.forName("UTF-8").encode("hello world").array();
System.out.println(byteArray.length);
Run Code Online (Sandbox Code Playgroud)
为什么上面的代码行打印出12,不应该打印11代替?
azu*_*rog 11
数组的长度是ByteBuffer容量的大小,它是由您编码的字符数生成的,但不等于您编码的字符数.让我们来看看我们如何为ByteBuffer... 分配内存
如果您深入研究该encode()方法,您会发现它CharsetEncoder#encode(CharBuffer)看起来像这样:
public final ByteBuffer encode(CharBuffer in)
throws CharacterCodingException
{
int n = (int)(in.remaining() * averageBytesPerChar());
ByteBuffer out = ByteBuffer.allocate(n);
...
Run Code Online (Sandbox Code Playgroud)
根据我的调试器,averageBytesPerChara UTF_8$Encoder是1.1,输入String有11字符. 11 * 1.1 = 12.1,并且代码int在计算时将总计转换为a ,因此得到的大小ByteBuffer为12.