Какой Charset использует ByteBuffer.asCharBuffer ()? - PullRequest
3 голосов
/ 19 июля 2011

Какой Charset использует ByteBuffer.asCharBuffer () ?Похоже, что в моей системе 3 байта преобразуются в один символ.

В соответствующей заметке как CharsetDecoder относится к ByteBuffer.asCharBuffer ()?

ОБНОВЛЕНИЕ : В отношении того, какую реализацию ByteBuffer я использую, я вызываю ByteBuffer.allocate(1024).asCharBuffer().Я не могу комментировать, какая реализация используется под капотом.

Ответы [ 3 ]

3 голосов
/ 19 июля 2011

Для первого вопроса - я полагаю, что он использует нативную кодировку символов Java (UTF-16).

1 голос
/ 19 июля 2011

Насколько я понимаю, он ничего не использует. Он просто предполагает, что он уже правильно декодирован как строка для Java, что означает UTF-16. Это можно показать, посмотрев на источник для HeapByteBuffer, где, наконец, возвращается возвращенный charbuffer (версия с прямым порядком байтов):

static private char makeChar(byte b1, byte b0) {
return (char)((b1 << 8) | (b0 & 0xff));
}

Так что единственное, что здесь обрабатывается, это порядковый номер остального, за который вы несете ответственность. Это также означает, что обычно гораздо полезнее использовать класс Decoder, где вы можете указать кодировку.

0 голосов
/ 19 июля 2011

Глядя на jdk7, jdk/src/share/classes/java/nio

  1. X-Buffer.java.template карты ByteBuffer.allocate() в Heap-X-Buffer.java.template
  2. Heap-X-Buffer.java.template карты ByteBuffer.asCharBuffer() в ByteBufferAs-X-Buffer.java.template
  3. ByteBuffer.asCharBuffer().toString() вызывает CharBuffer.put(CharBuffer), но я не могу понять, к чему это приводит

В конечном итоге это, вероятно, приводит к Bits.makeChar(), который определяется как:

static private char makeChar(byte b1, byte b0) {
    return (char)((b1 << 8) | (b0 & 0xff));
}

но я не могу понять, как.

...