2012-03-25 44 views
0

玉傢伙,你能告訴我是有一定的缺陷在當前代碼:使用NIO緩衝區對UTF-8進行編碼時是否存在錯誤?

//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編碼,包括 - 符號是在範圍ANCII(U + 007F)的 碼和10S是複雜UTF-8字符(U + 7FFFFFFF)的第一個比特所以接下來字節 這個符號將只在下一個緩衝區中。所以最後一個字符將被錯誤編碼或被錯過。 我是否正確以及如何解決此問題? 通過修復我的意思是解碼單獨的nio緩衝區,而不僅僅是獲取所有緩衝區後的整個字節序列。

回答

0

這裏有一堆問題。其中之一是你可能沒有讀完整個編碼字符。通常,在嘗試解碼消息之前,您需要有一些方法來確定您是否已經到達消息的末尾,如消息長度或換行符。

順便說一下:最大可能的代碼點是U + 10FFFF。最大的char的值是U + FFFF

+0

謝謝彼得,現在很清楚。 – 2012-03-25 13:20:11

+1

我發現有關這類問題的好文章,如果有人感興趣 - [鏈接](http://illegalargumentexception.blogspot.com/2009/05/java-rough-guide-to-character-encoding.html#javaencoding%5Fstringclass ),頭文件「使用String類進行編碼和解碼的潛在缺陷」也參見「BOM」使用 – 2012-03-27 14:23:36