下面是我的源代码,我先实现将GBK码转换为UTF-8码,但不能成功
请您分析一下,改进一下
public static void main( String args[] ) throws Exception
{
Scanner scanner = new Scanner( System.in );
String temp;
Charset   charset1   =     Charset.forName("GBK");   //映射
Charset   charset2   =     Charset.forName("UTF-8");

CharsetDecoder   decoder   =   charset1.newDecoder();   //解码器
CharsetEncoder   encoder   =   charset2.newEncoder();   //编码器 ByteBuffer   bytes = ByteBuffer.allocate(1024);//;

while( true )
{
temp = scanner.nextLine(); bytes.put( temp.getBytes() );
CharBuffer   chars   =   decoder.decode(bytes);   
bytes   =   encoder.encode(chars);  

String str = new String( bytes.array(), "UTF-8" );
System.out.println( "解码后:" + str );
}

}

解决方案 »

  1.   


        public ActionForward test(那4个参数){
         try {
    request.setCharacterEncoding("gb2312");
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    }
        。。试试 或者 搜索
      

  2.   

    试试 或者 搜索request.setCharacterEncoding("gb2312");
      

  3.   

    Charset  charset1  =    Charset.forName("GBK");  //映射 
    Charset  charset2  =    Charset.forName("UTF-8"); CharsetDecoder  decoder  =  charset1.newDecoder();  //解码器 
    CharsetEncoder  encoder  =  charset2.newEncoder();  //编码器 
    上面的代码中charset2,charset2都是独立的,都没有联系起来,不可能转换成功的。
    你这样改:
    CharsetDecoder  decoder  =  charset1.newDecoder();  //解码器 
    CharsetEncoder  encoder  =  decoder.newEncoder();  //编码器 试试看
      

  4.   

    String str = "some gbk string";
    str = new String(str.getBytes("GBK"),"UTF-8");
      

  5.   

    楼主你的 String temp;  temp变量的数据是怎么来的? java的字符串变量本身就是UTF-16格式保存数据的,就是说java的字符串变量永远不会是gbk等其它编码.  temp.getBytes() 得到的数组已经不是gbk编码了.你想解决你的问题,首先要解决给temp变量赋值的问题, 你把给temp赋值的语句贴出来了我就知道你的问题所在了.还有
    System.out.println( "解码后:" + str ); 中打印的str字符实际上也是utf-16的编码,因为java的字符串变量就是utf-16. 当然如果你打印出来不是乱码,可以证明你之前的转换是正确的. 
      

  6.   

    对不起,我上面说的有些地方错了,java 字符串变量不一定是unicode来存储的,我用jdk1.6 试了,它好象是根据当前系统默认的字符编码来存储字符的,
    就是说如果你的系统是简体windows  那么 String str = "你好" str 内的字符编码就是gbk了. 如果需要把gbk 转换成 utf-8 应该是这样
    String str = "你好";
    byte[] utf8bytes = str.getbytes("utf-8");utf8bytes 中存放的是utf-8编码的字节数组.
      

  7.   

    String str = "你好"; 
    byte[] utf8bytes = str.getbytes("utf-8"); 
    String utf8str = new String(utf8bytes); //这个打印是乱码
    String str2 = new String(utf8bytes,"utf-8"); //这个打印是'你好' 自己好好理解以上两句为什么utf8str 是乱码吧
      

  8.   

    會不會跟你的project設置的語言有關...eclipse中可以設
    java中使用unicode是沒錯的了,所以樓主用gbk的decoder來decode unicode編碼的東西,這步就不對了
      

  9.   

    是jvm自己选择的,我没设置什么,以前用jdk1.5 好象就是默认字符编码是unicode, java文档中也是用unicode(utf-16)的, 但我发现用jdk1.6 后,字符串变量的编码都是GBK码了. 
      

  10.   

    答:你的代码整体上是正确的.个别小地方要注意:
    1)bytes.put( temp.getBytes() ); 中的temp.getBytes() 在WIN平台运行是正常的,但在LINUX下运行会出问题的.故更好的办法是改为:temp.getBytes("GBK") 
    2)CharBuffer  chars  =  decoder.decode(bytes);  之前要加上:bytes.rewind();故最后的完整代码是:import java.nio.*;
    import java.nio.charset.*;
    import java.util.*;public class Testa {
    public static void main( String args[] ) throws Exception 

    Scanner scanner = new Scanner( System.in ); 
    String temp; 
    Charset  charset1  =    Charset.forName("GBK");  //映射 
    Charset  charset2  =    Charset.forName("UTF-8");  CharsetDecoder  decoder  =  charset1.newDecoder();  //解码器 
    CharsetEncoder  encoder  =  charset2.newEncoder();  //编码器  ByteBuffer  bytes = ByteBuffer.allocate(1024);//; // while( true ) 

    temp = scanner.nextLine();  bytes.put( temp.getBytes("GBK") ); //<==强制GBK,保证LINUX下也正确

    bytes.rewind();//<==要绕回.否则decode()不正确

    CharBuffer  chars  =  decoder.decode(bytes);  

    bytes  =  encoder.encode(chars);   String str = new String( bytes.array(), "UTF-8" ); 
    System.out.println( "解码后:" + str ); 
    }  }
    }