我想将GBK转成UTF-8再转回GBK,可是大部分汉字显示正确,比如,汉字、中国等都没问题,
但“国债”,显示后就是乱码。哪位遇见过这种问题。以下是我的测试代码:
public class Test
{
    public static void main(String[] args)
    {        String GBK = "国债";
        String UTF8 = "";
        String newGBK = "";        System.out.println("1=" + GBK);
        try
        {
            UTF8 = new String(GBK.getBytes("UTF-8"), "GBK");
        }
        catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }
        System.out.println("2=" + UTF8);        try
        {
            newGBK = new String(UTF8.getBytes("GBK"),"UTF-8");
        }
        catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }
        System.out.println("3=" + newGBK);
    }
}

解决方案 »

  1.   

    很显然,你的默认编码不是UTF-8
      

  2.   

    new String(GBK.getBytes("UTF-8"), "GBK");
    这样的转法是错误的,搂主的概念是不对的,String 是 unicode 字符串。推荐搂主一篇文章,相信可以让你正确的理解相关概念:
    http://www.regexlab.com/zh/encoding.htm
      

  3.   

    输入:中国结果:
    1=中国
    2=涓浗
    3=中国输入:国债结果:
    1=国债
    2=鍥藉??
    3=国???输入:债债结果:
    1=债债
    2=鍊哄??
    3=债???难道是“债”转成的UTF-8作为 String 的结尾时有什么特殊意义?
      

  4.   

    java中任何String的编码都是UNICODE
    bytes = str.getBytes(code)表示取得str的已code编码方式编码的字节数组
    str = new String(bytes,code)表示将bytes字节数组转换为字符串,bytes的编码必须与code匹配
      

  5.   

    netpotRL说的正是我想表达的,
    输入:中国结果:
    1=中国
    2=涓浗
    3=中国输入:国债结果:
    1=国债
    2=鍥藉??
    3=国???输入:债债结果:
    1=债债
    2=鍊哄??
    3=债???所以
      

  6.   

    sswater(光杆兵),是否可以推荐一种正确的转码方式
      

  7.   

    改动了一下: public static void main(String[] args) {
            String GBK = "国债123";
            String UTF8 = "";
            String GB2312 = "";
            
            System.out.println("1=" + GBK +"  \t长度:"+GBK.length());
            try
            {
                byte [] b = GBK.getBytes("GBK");
                UTF8 = new String(b, "UTF-8");
                System.out.println("2=" + b +"  \t长度:"+b.length);
            }
            catch (UnsupportedEncodingException e)
            {
                e.printStackTrace();
            }
            System.out.println("3=" + UTF8 +"  \t长度:"+UTF8.length());        try
            {
                byte [] b = GBK.getBytes("GBK");
                GB2312 = new String(b,"GB2312");
            }
            catch (UnsupportedEncodingException e)
            {
                e.printStackTrace();
            }
            System.out.println("4=" + GB2312 +"  \t长度:"+GB2312.length());
    }结果是:1=国债123   长度:5
    2=[B@35ce36   长度:7
    3=???123   长度:6
    4=国债123   长度:5谁能解释一下??
      

  8.   

    utf-8并非字符集编码本身,而是unicode编码的存储或传输的串行化“格式”。utf-8针对不同的unicode编码段采取不同字节数的编码格式,对于utf-8而言,不同的字符编码格式占用的字节数是不等长的,记得其中ascii段的字符都占用一个字节,部分特殊符号和字符占用两个字节,汉字或统汉字或其它东亚字符等都占用三个字节,不能一概而论。具体细节请参考unicode和utf规范。
      

  9.   

    public static void main(String[] args) {
            String GBK = "国债123";
            String UTF8 = "";
            String GB2312 = "";
            
            //----------- 没有转码前 -------------------
            System.out.println("1=" + GBK +"  \t长度:"+GBK.length());
            try
            {
                byte [] b = GBK.getBytes("GBK");
                UTF8 = new String(b, "UTF-8");
                System.out.println("2=" + b +"  \t长度:"+b.length);
            }
            catch (UnsupportedEncodingException e)
            {
                e.printStackTrace();
            }
            //----------- GBK -> UTF-8 -------------------
            System.out.println("3=" + UTF8 +"  \t长度:"+UTF8.length());       
            try
            {
                //正确的逻辑应该是byte [] b = UTF8.getBytes("GBK")
                byte [] b = GBK.getBytes("GBK");
                GB2312 = new String(b,"GB2312");
            }
            catch (UnsupportedEncodingException e)
            {
                e.printStackTrace();
            }
            //----------- GBK -> GB2312 -------------------
            //----------- 应该是UTF-8 ->GB2312
            //
            System.out.println("4=" + GB2312 +"  \t长度:"+GB2312.length());
    }
      

  10.   

    其实我的程序是要把带汉字的数据以UTF-8的编码方式存到一个文件中。在另外的程序中把文件中的数据取出来,正确显示出来。上面大致是我的转码方式,请高人指点。
    或者可以提供一种的转码方式,能正确显示UTF-8的汉字就行
      

  11.   

    对于 String GBK = "国债" 来说,"将GBK转成UTF-8再转回GBK" 这种说法本身就是不对的,概念上不正确。因为:Java 中的 String 本身就是是 UNICODE 字符串,并非 byte 的多字节字符串。对于 C++ 中的 char[] 来说,有 "字符串的编码" 这个概念,进行的操作是:
    GBK 的 char[]  =>  UNICODE 字符串 wchar_t[]  => utf-8 的 char[]因此,对于 Java 来说,String 本来就是 UNICODE 字符串,GBK 与 UTF8 之间不存在这样的转换过程:(注意,是不存在)
    String(UNICODE 字符串) =>  字节串 byte[]  =>  String(UNICODE 字符串)搂主提这个问题本身,就说明概念理解不正确。而我推荐的文章可以让你理解其中的道理:
    http://www.regexlab.com/zh/encoding.htm
      

  12.   

    要把带汉字的数据以UTF-8的编码方式存到一个文件中,不需要进行转化,只需要:Writer out = new OutputStreamWriter(new FileOutputStream("d:\\a.txt"), "utf-8");
    out.write("中文");就可以了,因为 String 是 UNICODE 字符串。其中的原理,欢迎参考我推荐的文章。
      

  13.   

    sswater(光杆兵) 是说:
    String GBK = "国债";
    GBK本身的字符集不是“GBK”?
    那么GBK(UNICODE)的字符集是指哪个?
      

  14.   

    to:sswater(光杆兵) 1=国债
    2=鍥藉??
    3=国???那么我怎么才能将
    String str = "鍥藉??";
    正确的显示出来?
      

  15.   

    to:sswater(光杆兵) :
    我是用
    new OutputStreamWriter( new FileOutputStream(file, false), "UTF-8" )
    的方式存的。可是取出来就是不知道怎么样转成正确显示的汉字
      

  16.   

    同样的道理:
    new InputStreamReader(new FileInputStream(file), "utf-8")得到的字符串不需要进行转化,因为 String 是 UNICODE 的。
    希望你可以从我的文章中,知道其中是原理,知道为什么这样。:)
      

  17.   

    String str = "国债";之后,这个 str 与 GBK 没有任何关系。
    str 中存放的内容为 2 个数字,分别是 '国' 和 '债' 在 UNICODE 字符集中的编号。
      

  18.   

    是需要转化的:
    1.从我的实践来看,取出来的是
     鍥藉??
     不直接转是不行的。
    2.从你推荐的文章来看
    // 从字节按照 GB2312 得到 UNICODE 字符串
    string = new String(bytes, "GB2312");
    //UNICODE 字符集,也分GB2312和UTF-8
    所以还得正确显示出来
      

  19.   

    "UNICODE 字符集,也分GB2312和UTF-8"
    这个说法是不对的。
      

  20.   

    读取是:
    new InputStreamReader(new FileInputStream(file), "utf-8")
    (注意有个 utf-8)
      

  21.   

    sorry,刚看到ANSI 编码 
    ----------
    GB2312,
    BIG5,
    Shift_JIS,UNICODE 编码 
    -------------
    UTF-8,
    UTF-16, UnicodeBig …… 
      

  22.   

    有什么问题,或者觉得我说的是不对的,可以通过 msn 跟我聊,在这里反复回复不是办法。
    msn: [email protected]理解的关键是要把 'UNICODE 字符' 与 '字节' 的概念区分。
      

  23.   

    new InputStreamReader(new FileInputStream(file), "utf-8")这个方法是正确的,我测试了。非常感谢!