好的,你能告诉我当前代码中是否存在某个错误:
//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缓冲区而不仅仅是整个字节序列。
答案 0 :(得分:0)
这里有很多问题。其中之一是您可能没有读过整个编码字符。通常,您需要有一些方法可以在尝试解码之前确定已到达消息的末尾,例如消息长度或换行符。
BTW:最大可能的代码点是U + 10FFFF。最大的char
值是U + FFFF