CharBufferクラス符号化に関する問題
2392 ワード
CharBufferはjavaです.nioの下の文字キャッシュクラスは、一般的には使えません.普段はByteBufferで代用しています.
暇な時、研究してみると、CharBufferは符号化変換に奇妙な問題があることが分かった.
CharBufferオブジェクトを取得する方法は
ByteBuffer byteBuffer=ByteBuffer.allocate(1024);
byteBuffer.put(「テスト文字aabc」.getBytes();
byteBuffer.asCharBuffer();
CharBuffer charBuffer=CharBuffer.wrap();
CharBuffer charBuffer=CharBuffer.allocate();
エラーの使用:
ByteBufferを文字列に変換して、直接次の方法で変換できると考えられています.
byteBuffer.asCharBuffer().toString();
これは間違いです.(byteBufferに格納されているバイトがutf-16 beでない限り、正常に出力できます)
byteBufferに格納されているバイトがutf-16 beでない場合、asCharBufferメソッドでCharBufferに変換した後、どのように正しく出力されますか.
テストコードは次のとおりです.
したがって、ByteBufferにUTF-16 BE符号化されたバイトを格納する場合、asCharBuffer()を直接使用して文字バッファに変換することができる.
では、UTF-16 BEコードを格納していないByteBufferについては、
CharBuffer charBuffer=Charset.forName(「文字コード」).decode(byteBuffer)が変換されます.
注意事項:
1、ByteBufferバイトバッファのビューバッファ例えばCharBuffer、IntBuffer、LongBuffer等を操作して位置変化を引き起こす場合、下位のByteBufferの位置(position,limit,mark等)は変化しない.
2、インデックスパラメータ付きのデータput(index)の追加とデータget(index)の取得方法がいくつかあることに注意してください.位置は変わりません.
暇な時、研究してみると、CharBufferは符号化変換に奇妙な問題があることが分かった.
CharBufferオブジェクトを取得する方法は
ByteBuffer byteBuffer=ByteBuffer.allocate(1024);
byteBuffer.put(「テスト文字aabc」.getBytes();
byteBuffer.asCharBuffer();
CharBuffer charBuffer=CharBuffer.wrap();
CharBuffer charBuffer=CharBuffer.allocate();
エラーの使用:
ByteBufferを文字列に変換して、直接次の方法で変換できると考えられています.
byteBuffer.asCharBuffer().toString();
これは間違いです.(byteBufferに格納されているバイトがutf-16 beでない限り、正常に出力できます)
byteBufferに格納されているバイトがutf-16 beでない場合、asCharBufferメソッドでCharBufferに変換した後、どのように正しく出力されますか.
テストコードは次のとおりです.
package com.cgb.train.core.nio;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
public class CharBufferTest2 {
/**
* @param args
* @throws UnsupportedEncodingException
*/
public static void main(String[] args) throws UnsupportedEncodingException {
// TODO Auto-generated method stub
String s=" abc";
ByteBuffer byteBuffer1=ByteBuffer.allocate(50);
ByteBuffer byteBuffer2=ByteBuffer.allocate(50);
byteBuffer1.put(s.getBytes("UTF-16BE"));// utf-16be
byteBuffer1.flip();// put ,position 。 。
byteBuffer2.put(s.getBytes());//
byteBuffer2.flip();
System.out.println(byteBuffer1.asCharBuffer().toString());
/**
*
*/
System.out.println(byteBuffer2.asCharBuffer().toString());
/**
* , 。
*
* ByteBuffer.wrap(s.getBytes , flip, 。
*
*/
System.out.println(ByteBuffer.wrap(s.getBytes("UTF-16BE")).asCharBuffer().toString());
}
}
したがって、ByteBufferにUTF-16 BE符号化されたバイトを格納する場合、asCharBuffer()を直接使用して文字バッファに変換することができる.
では、UTF-16 BEコードを格納していないByteBufferについては、
CharBuffer charBuffer=Charset.forName(「文字コード」).decode(byteBuffer)が変換されます.
注意事項:
1、ByteBufferバイトバッファのビューバッファ例えばCharBuffer、IntBuffer、LongBuffer等を操作して位置変化を引き起こす場合、下位のByteBufferの位置(position,limit,mark等)は変化しない.
2、インデックスパラメータ付きのデータput(index)の追加とデータget(index)の取得方法がいくつかあることに注意してください.位置は変わりません.