使用NIO缓冲区编码UTF-8时是否存在错误?

时间:2012-03-25 12:45:48

标签: java character-encoding buffer nio

好的,你能告诉我当前代码中是否存在某个错误:

//this all only for example so DO NOT use this terrible code
1   private void readIncomingData(SocketChannel channel){

2    try{                                     //10 - for simplicity sake
4      ByteBuffer buffer = ByteBuffer.allocate( 10 );
5      buffer.clear();

6      channel.read( buffer );

8      StringBuilder response = new StringBuilder();

9      buffer.flip();

10     Charset charset = Charset.forName(“UTF-8″);

12     //HERE IS THE DILEMMA !!!   
13     response.append( charset.decode( buffer ) );

14     // Output the response
15     System.out.println( “Data read from client ” + response );

16   } catch (IOException e) {
17     e.printStackTrace();
18  }

19}

例如,输入文字为 UTF-8 编码且由 9 组成 - 符号在 ANCII(U + 007F)范围内 代码和10s是复杂的 UTF-8 char (U + 7FFFFFFF)的第一位,所以下一个 5 字节 此符号仅在下一个缓冲区中。所以最后一个字符编码错误或被遗漏。 我是对的,如何解决这个问题? 通过修复我的意思是在获得所有缓冲区之后解码单独的nio缓冲区而不仅仅是整个字节序列。

1 个答案:

答案 0 :(得分:0)

这里有很多问题。其中之一是您可能没有读过整个编码字符。通常,您需要有一些方法可以在尝试解码之前确定已到达消息的末尾,例如消息长度或换行符。

BTW:最大可能的代码点是U + 10FFFF。最大的char值是U + FFFF