Есть ли ошибка при кодировании UTF-8 с использованием буферов NIO? - PullRequest
1 голос
/ 25 марта 2012

Хорошо, ребята, не могли бы вы сказать, есть ли определенная ошибка в текущем коде:

//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) кодов, а 10 с - это первый бит комплексного UTF-8 char (U + 7FFFFFFF) , поэтому следующие 5 байтов этого символа будут только в следующем буфере.Таким образом, последний символ будет закодирован неправильно или будет пропущен.Прав ли я и как это исправить?Под фиксацией я имею в виду декодирование отдельных буферов nio, а не только всей последовательности байтов после получения всех буферов.

1 Ответ

0 голосов
/ 25 марта 2012

У вас здесь куча проблем.Одним из них является то, что вы, возможно, не прочитали весь закодированный символ.Обычно вам нужно иметь некоторые средства, чтобы определить, что вы достигли конца сообщения, такие как длина сообщения или новая строка, прежде чем пытаться его декодировать.

Кстати: максимально возможная кодовая точка - U + 10FFFF.Самые большие значения char: U + FFFF

...