下面是我的源代码,我先实现将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 );
}
}
请您分析一下,改进一下
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 );
}
}
public ActionForward test(那4个参数){
try {
request.setCharacterEncoding("gb2312");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
。。试试 或者 搜索
Charset charset2 = Charset.forName("UTF-8"); CharsetDecoder decoder = charset1.newDecoder(); //解码器
CharsetEncoder encoder = charset2.newEncoder(); //编码器
上面的代码中charset2,charset2都是独立的,都没有联系起来,不可能转换成功的。
你这样改:
CharsetDecoder decoder = charset1.newDecoder(); //解码器
CharsetEncoder encoder = decoder.newEncoder(); //编码器 试试看
str = new String(str.getBytes("GBK"),"UTF-8");
System.out.println( "解码后:" + str ); 中打印的str字符实际上也是utf-16的编码,因为java的字符串变量就是utf-16. 当然如果你打印出来不是乱码,可以证明你之前的转换是正确的.
就是说如果你的系统是简体windows 那么 String str = "你好" str 内的字符编码就是gbk了. 如果需要把gbk 转换成 utf-8 应该是这样
String str = "你好";
byte[] utf8bytes = str.getbytes("utf-8");utf8bytes 中存放的是utf-8编码的字节数组.
byte[] utf8bytes = str.getbytes("utf-8");
String utf8str = new String(utf8bytes); //这个打印是乱码
String str2 = new String(utf8bytes,"utf-8"); //这个打印是'你好' 自己好好理解以上两句为什么utf8str 是乱码吧
java中使用unicode是沒錯的了,所以樓主用gbk的decoder來decode unicode編碼的東西,這步就不對了
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 );
} }
}