首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

关于字符集的有关问题

2012-02-16 
关于字符集的问题importjava.util.*classTest{publicstaticvoidmain(String[]args)throwsException{intda

关于字符集的问题
import   java.util.*;

class   Test
{
    public   static   void   main(String[]   args)   throws   Exception
    {
        int   data;
        byte[]   buf=new   byte[100];
        int   i=0;
        while((data=System.in.read()   )!= 'q ')       //输入   q   退出
        {
            buf[i]=(byte)data;
            i++;
        }
        String   str=new   String(buf,0,i);
        System.out.println(new   String(str.getBytes( "ISO-8859-1 "), "ISO-8859-1 "));
    }
}

输入一个汉字,为什么输出的是乱码   ?
假设输入“程序”两字,一个汉字占两字节,假设在十六进制下的GBK   码是:12   34   56   78   。那么存在buf   字节数组中的内容也就是:12   34   56   78   。接下来按   GBK   解码得到字符串   str   ,内容是“程序”,正确!

然后   str内容   按   ISO-8859-1   编码。str内容   两个汉字占4个字节,虽然   ISO-8859-1   是按单字节编码,那么四个字节应该要编码4次,然后按   ISO-8859-1   解码。应该得到4个字节的内容吧,那为什么输出的只有2个问号   ?(Jbuilder9   下测试)


[解决办法]
你应该在

String str=new String(buf,0,i);

这里指定 ISO-8859-1 来构造字符串
[解决办法]
String str=new String(buf,0,i);
这里已经成功的构造了字符串
输入汉字时jvm会自动用默认的字符集去生成byte数据
而你构造String时也是用的默认的字符集

new String(str.getBytes( "ISO-8859-1 "), "ISO-8859-1 "))会生成乱码的原因是
str.getBytes( "ISO-8859-1 ")把非ISO-8859-1编码的汉字转换成字节时就会用 "? "去代替汉字
汉字的代码完全丢失了,当然就回不来了

可以参考我的blog中相关的介绍:
http://blog.csdn.net/polarman/archive/2007/04/30/1593159.aspx
[解决办法]
楼主概念混乱,推荐参考:
http://www.regexlab.com/zh/encoding.htm

如果有汉字, new String(str.getBytes( "iso-8859-1 "), "iso-8859-1 ") 将必然得到乱码

热点排行