一个字符串,本来就是utf-8编码(utf-8是正确编码),我想转成gbk编码. 然后反之转换回去.
java里有没有函数库提供转换? 
另外 new String(xxx.getBytes("utf-8"),"gbk")  这个方法是字符串是gbk编码但是转换错了(转换成utf-8),然后用这个方法转换回来.所以跟我的问题不一样. 

解决方案 »

  1.   

    我网上找了一下 貌似有朋友 写了  utfTogbk的函数  不过没找到  gbkToUtf的. 不知道java库里有没有提供类似的功能 
      

  2.   

    io流里面倒是有几个类可以指定字符集进行转换,例如这个:PrintWriter(File file, String csn) 
              创建具有指定文件和字符集且不带自动刷行新的新 PrintWriter。
      

  3.   

    字符串就是字符串,就是一串 Char 的序列,无所谓什么编码运行时内存中存储,Java 都是按 Unicode===============================================只有当字符串转换成 byte 序列,或者是 byte 序列转化成字符串时,才有涉及到编码说到底 charset 是一个转换规则, 是转换过程才涉及的===============================================“一个字符串,本来就是utf-8编码(utf-8是正确编码)”把 utf-8 编码规则当成字符串的一种状态了, 注意 charset 是一种规则而不是一种状态所以这样的表述 很难让人猜中你具体是什么样的实际情况===============================================Java 的 String 有 getBytes(charset) 方法, charset 是指定的编码规则
    是将字符串转换成 byte[],一般字符串需要通过流传递,都会有这样一个过程。
    (这个过程,可能是需要你手动完成,又可能是由底层程序自动完成)发送方把 String 按一定的规则编码,变成二进制数据(byte[]), charset 就是所使用的规则
    接收方 收到了 byte[] 后,使用相同的规则 (charset) 进行逆操作,也就是解码。从而得到正确还原后的 String
    如果编码使用的规则(charset) 与解码使用的规则不一致 则导致接收方无法还原字符串,从而得到所谓的 乱码。
    str.getBytes(charset) 就是一个编码过程,把字符串转换成 byte 数组, 也就是 byte 序列
    new String(bytes, charset) 就是一个解码过程,解码 byte序列, 还原为 String 正确的运用好这两个功能。
    再详细分析一下实际情况,应该可以自己搞惦如果,还有遇到问题。。 再提出来让大家讨论分析
      

  4.   

    另外 new String(xxx.getBytes("utf-8"),"gbk") 这个方法是字符串是gbk编码但是转换错了(转换成utf-8),然后用这个方法转换回来.所以跟我的问题不一样. jdk还会为了处理转码错误而特意设置函数?你试试再说!你想实现什么? java都是unicode的
      

  5.   

    这需要 UTF-8 与 GBK 的字符映射表,否则转不了!不过在 JAVA 中都是采用 Unicode 来表示的。
      

  6.   

    楼上几位都说得很对,这里我补充一点,我们常用的工具,例如Tomcat\ecplise等等都是国外的写的,这些工具中的编码,在默认情况下都是ISO8859-1的
      

  7.   

    你所说的这种现象是可以通过代码来实现的,我以前在处理这样的事情时把GBK转换成UTF-8都是用代码来处理的。。
      

  8.   

    我的意思可能没说明白,举个例子, 如果有2个模块,一个模块A内部处理统一为gbk编码, 另一个模块B是统一为utf-8编码,2者通过XML数据通信. 那么一个字符串是gbk编码在A系统是可以正确显示并处理的.但是如果要生成utf-8编码的XML数据传给B系统那就有问题了.
      

  9.   

    java的字符串都是unicode的。应该是utf-8  ---->  unicode(可以在这里修改) ----->  gbk 
      

  10.   


    这类情况 A, B 约定好传输编码就可以. 
    比如 A中 str.getBytes("UTF-8") 得到 byte[], 把这字节序列 bytes 传给 B 后, B 用 new String(bytes, "UTF-8") 就能还原字符串内容的不知道你们的系统是怎么设计的. 最好给出 A,B 具体的 收发接口------------------------------------------------
    楼主仍然错误的认为 Java 中的 String 有 GBK,UTF-8 之分.需要明确, java 中的 String 没那么复杂, 不管是 A系统里的 String,还是 B系统中的 String, 运行时它们都是以 Unicode 编码存在内存里的
      

  11.   

    唉~貌似很多人没明白我的意思.其实很简单就是用java实现.net里这个功能:
    byte[] returnBytes = Encoding.Convert( Encoding.UTF8, Encoding.GetEncoding("gb2312"), bytes); 
      

  12.   

    贴一个别人写的 utf2gbk. 但是我想问java框架是否存在这样的功能.存在的话那互相转换会方便很多public static byte[] utfToGBK(byte[] srcByte,String encoding) throws UTFDataFormatException{ 
        StringBuffer str = new StringBuffer(); 
        int len = srcByte.length; 
        int char1, char2, char3; 
        int count = 0; 
        while (count < len) { 
          char1 = (int) srcByte[count] & 0xff; 
          switch (char1 >> 4) { 
            case 0: 
            case 1: 
            case 2: 
            case 3: 
            case 4: 
            case 5: 
            case 6: 
            case 7: 
              count++; 
              str.append( (char) char1); 
              break; 
            case 12: 
            case 13: 
              count += 2; 
              if (count > len) { 
                throw new UTFDataFormatException(); 
              } 
              char2 = (int) srcByte[count - 1]; 
              if ( (char2 & 0xC0) != 0x80) { 
                throw new UTFDataFormatException(); 
              } 
              str.append( (char) ( ( (char1 & 0x1F) << 6) | (char2 & 0x3F))); 
              break; 
            case 14: 
      
              /* 1110 xxxx  10xx xxxx  10xx xxxx */ 
              count += 3; 
              if (count > len) { 
                throw new UTFDataFormatException(); 
              } 
              char2 = (int) srcByte[count - 2]; 
              char3 = (int) srcByte[count - 1]; 
              if ( ( (char2 & 0xC0) != 0x80) || ( (char3 & 0xC0) != 0x80)) { 
                throw new UTFDataFormatException(); 
              } 
              str.append( (char) ( ( (char1 & 0x0F) << 12) | 
                                  ( (char2 & 0x3F) << 6) | 
                                  ( (char3 & 0x3F) << 0))); 
              break; 
            default: 
              throw new UTFDataFormatException(); 
          } 
        } 
        String temp = new String(str); 
        try{ 
          if(encoding==null) encoding = "GBK"; 
          return temp.getBytes(encoding); 
        }catch(Exception e){ 
          return null; 
        } 
      }
      

  13.   

    byte[] utfBytes = new byte[100];
    ....
    try {
    byte[] gbkBytes = new String(utfBytes).getBytes("GBK");
    } catch (UnsupportedEncodingException e) {
    }
      

  14.   

    试了一下应该没问题
    byte[] utfBytes = new String("我").getBytes("UTF-8");
    for (byte b:utfBytes) System.out.print(Integer.toHexString(b&0x000000ff)+" ");
    System.out.println();
    byte[] gbkBytes = new String(utfBytes).getBytes("GBK");
    for (byte b:gbkBytes) System.out.print(Integer.toHexString(b&0x000000ff)+" ");
      

  15.   

    反过来是
    byte[] gbkBytes = new String("我").getBytes("GBK");
    for (byte b:gbkBytes) System.out.print(Integer.toHexString(b&0x000000ff)+" ");
    System.out.println();
    byte[] utfBytes = new String(gbkBytes,"GBK").getBytes("UTF-8");
    for (byte b:utfBytes) System.out.print(Integer.toHexString(b&0x000000ff)+" ");
    System.out.println();
      

  16.   

    byte[] returnBytes = Encoding.Convert( Encoding.UTF8, Encoding.GetEncoding("gb2312"), bytes); 那你这个是 byte[] 从 utf-8 转 gb2312
    你为什么说是 字符串 (string)  从 utf-8 转 gb2312字符串没有分什么 utf-8, gb2312, 运行时,都统一 unicode 表示// java
    byte[] returnBytes = new String(bytes, "UTF-8").getBytes("GBK");