UTF-8 有一下特性: UCS 字符 U+0000 到 U+007F (ASCII) 被编码为字节 0x00 到 0x7F (ASCII 兼容). 这意味着只包含 7 位 ASCII 字符的文件在 ASCII 和 UTF-8 两种编码方式下是一样的. 
所有 >U+007F 的 UCS 字符被编码为一个多个字节的串, 每个字节都有标记位集. 因此, ASCII 字节 (0x00-0x7F) 不可能作为任何其他字符的一部分. 
表示非 ASCII 字符的多字节串的第一个字节总是在 0xC0 到 0xFD 的范围里, 并指出这个字符包含多少个字节. 多字节串的其余字节都在 0x80 到 0xBF 范围里. 这使得重新同步非常容易, 并使编码无国界, 且很少受丢失字节的影响. 
可以编入所有可能的 231个 UCS 代码 
UTF-8 编码字符理论上可以最多到 6 个字节长, 然而 16 位 BMP 字符最多只用到 3 字节长. 
Bigendian UCS-4 字节串的排列顺序是预定的. 
字节 0xFE 和 0xFF 在 UTF-8 编码中从未用到. 
下列字节串用来表示一个字符. 用到哪个串取决于该字符在 Unicode 中的序号.U-00000000 - U-0000007F:  0xxxxxxx  
U-00000080 - U-000007FF:  110xxxxx 10xxxxxx  
U-00000800 - U-0000FFFF:  1110xxxx 10xxxxxx 10xxxxxx  
U-00010000 - U-001FFFFF:  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx  
U-00200000 - U-03FFFFFF:  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  
U-04000000 - U-7FFFFFFF:  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  xxx 的位置由字符编码数的二进制表示的位填入. 越靠右的 x 具有越少的特殊意义. 只用最短的那个足够表达一个字符编码数的多字节串. 注意在多字节串中, 第一个字节的开头"1"的数目就是整个串中字节的数目.例如: Unicode 字符 U+00A9 = 1010 1001 (版权符号) 在 UTF-8 里的编码为:11000010 10101001 = 0xC2 0xA9而字符 U+2260 = 0010 0010 0110 0000 (不等于) 编码为:11100010 10001001 10100000 = 0xE2 0x89 0xA0这种编码的官方名字拼写为 UTF-8, 其中 UTF 代表 UCS Transformation Format. 请勿在任何文档中用其他名字 (比如 utf8 或 UTF_8) 来表示 UTF-8, 当然除非你指的是一个变量名而不是这种编码本身

解决方案 »

  1.   


    看看这个可以不?public static final String UTF8ToGBK(byte[] src)
       {
            try{
                return new String(new String(src,"UTF-8").getBytes("GBK"));
            }
            catch (UnsupportedEncodingException e )
            {
                System.out.println("UTF8ToDefault:"+e.getMessage());
                return null;
            }    }
      

  2.   


    It very easy!
    byte []utf8 ;// 假设这个变量里已经存放了utf8编码的数据String unicodeStr = new String(utf8, "utf-8");//先转换为UNICODE字符串byte [] gbk = unicodeStr.getBytes("GBK");//转换为GBK编码数据
      

  3.   

    问题还是没有解决
    测试例子如下:
    对于字符   “三”它的UTF-8编码是11001000,10111101(状态1)
    转化成Unicode是00000010,00111101(状态2)
    GBK 是11001000,11111101(状态3)
    我现在要从状态1转到状态3,怎么实现??
      

  4.   

    String san="三";
    String sanUnicode=new String(san.getBytes("GBK"));
    String sanUTF8=new String(san.getBytes("UTF-8"));
      

  5.   

    第三句错了,改为
    String sanUTF8=new String(san.getbytes("GBK"),"UTF-8");
      

  6.   

    应当是这样的:
    String gbk="你";
    String utf=new String(gbk.getBytes("gb2312"),"utf-8");
    System.out.println(utf);
    这时候utf里面的字符都是java内核编码的字符,但是他们能够转换到标准的utf-8编码
    如果这时候,你在一个以utf-8为默认编码的计算机上运行编译后的class文件,那么一定会输出 <你>  但是,如过你在windows系统下,输出一定是乱码
      

  7.   

    上面两位朋友提供的方法我都尝试过了,还是不行,
    而且我是需要从utf-8转到gbk,还有什么好的方法吗??
      

  8.   

    return new String(new String(src,"iso8859-1").getBytes("GBK"));
    这样就可以了
    不要转来转去
    你是一下看看
      

  9.   

    我觉得 DataInputStream.ReadUTF();就可以阿
    具体的楼主查一下类库
    DataInputStream类
      

  10.   

    还是没有解决,有兴趣的可以帮我添上下面的程序
    public String utfToGbk(byte[] utf_b){
      // 返回gbk字符
    }测试如下:byte[] utfb=new byte[2];
          utfb[0]=-56;utfb[1]=-67;     //这是汉字"三"的utf-8编码
       String result=utfToGbk(utfb);   //得到的结果应该是"三"
      

  11.   

    怎么搞的这么复杂?
    byte[] buf = ××××  //需要转化的东西用byte[]读进来。String temp= new String(buf, from) //from 是你已知的编码名称。在这里是UTF8buf = temp.getBytes(to);//to 是你要转成什么编码。 这里是GBK.需要注意的是在把字符串读进来之前要确定该字符串绝对是utf8,读进来时一定要用inputStream 流的方式,不要用reader. 转化好之后的byte[]数组可以用outputStream写出去,但是不要再转成字符串,也不能用writer写出去。
      

  12.   

    to hellking(信息孤岛):不行啊,有异常抛出
      

  13.   

    jinjin_hz(咖啡豆):问题是这样的
    String gbk="你";
    String utf=new String(gbk.getBytes("gb2312"),"utf-8");//注意这时候,utf字符串
    已经是一个标准的utf-8字符对照到java编码了
    String tmp=new String(utf.getBytes("utf-8"),"gb2312");//注意这就是把一个utf-8映射
    到gbk编码的方法。
    System.out.println(tmp);//输出的肯定是 <你>//所以如果你有一个utf-8编码的字符串,就可使用
    String tmp=new String(utf.getBytes("utf-8"),"gb2312");祝你好运!
      

  14.   

    kknd97(绝地风暴) :
    你的方法行不通!!!!
      

  15.   

    jinjin_hz(咖啡豆) :
    注意,我的方法有一个前提就是,你必须得到一个标准的utf-8的字符串
    这样,你能不能把你的问题,详细的说明一下。如果不是很麻烦的话祝你好运!
      

  16.   

    感谢各位的帮助,我的问题已经解决了,不过用了其他方法,没有使用编码转换,我发现人有时候是不能钻死胡同的,也许换个思考方法,别有一番洞天,不过在解决问题过程中也确实学到了很多东西,例如有些编码的编码方式,转换方式,都是很有趣的,也谢谢各位的帮助!
    有兴趣的朋友可以继续研究这个问题:描述如下:
    public String utfToGbk(byte[] utf_b){
      // 返回gbk字符(待Ntian
    }
    测试如下:byte[] utfb=new byte[2];
          utfb[0]=-56;utfb[1]=-67;     //这是汉字"三"的utf-8编码
       String result=utfToGbk(utfb);   //得到的结果应该是"三"