JAVA 的字符编码的问题

JAVA 的字符编码的问题

首先讲一讲字符集
 JDK1.4版本引入了java.nio包加入了Charset类来统一字符集的转换,字符集给出了双字节Unicode码序列与本地字符编码中采用的字节序列之间的映射
字符集的名称不区分大小写,可以用官方名称或者任何一个别名调用静态方法forName来获得Charset

1 Charset charset = Charset.forName( "GBK " );
Charset的aliases()方法返回一个Set<String>集合,表示该字符集所具有的所有别名
Set < String >  aliases = charset.aliases();
查看虚拟机所支持的字符集以及名字可用Charset的静态方法availableCharsets()返回一个SortedMap
1  Map < String,Charset >  map = Charset.availableCharsets();
2              for (String setname:map.keySet())  {
3                System.out.println(setname);
4            }
一旦有了字符集,就可以用他在本地字符串和Unicode字节序列之间转换
如下将一个字符串编码为gbk    charset.encode(str)函数返回一个ByteBuffer对象
1 String str = new  String( " 晓宇 " );
2             ByteBuffer  buff  =  charset.encode(str);
3              byte [] bytes = buff.array();
同样,可以将刚才按照GBK方式编码的字节流解码为正确的字符流
1 ByteBuffer by = ByteBuffer.wrap(bytes,  0 , bytes.length);
2       CharBuffer cb = charset.decode(by); // 返回一个CharBuffer对象,已经将字节数组转化为字符数组
3       System.out.println( "    " + cb.toString());


实际上String类中集成了Charset对象的使用,String类有两个用于编码和解码的函数

1 byte [] bytes  =  str.getBytes( " CharsetName " );   // 将字符串str按照指定名称的Charset进行编码成字节数组
2             String str2 = new  String(bytes, " CharsetName " );  // 将字节数组按照指定名称的Charset解码为字符串


在输入输出流中有两个用于将字节流转化为指定编码格式的字符流的类  InputStreamReader/OutputStreamReader
这两个类是读写流和读写器的桥梁 用法如下

1 InputStreamReader isr  =   new  InputStreamReader(in,  " charsetname " );
2             BufferedReader br  =   new  BufferedReader(isr); // 加入一个BufferedReader,可以用到该类的readLine()

该用法在我的另外一篇socket备忘的里面体现了,可将网络传过来的utf-8格式编码的字节流正确的解码,以至于显示的时候不会出现乱码





你可能感兴趣的:(JAVA 的字符编码的问题)