java中UTF-8转GBK为什么不会出现中文乱码?

package test;
import java.io.*;
public class ssa {

public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(System.getProperty("file.encoding"));
System.getProperties().put("file.encoding", "UTF-8");
System.out.println(System.getProperty("file.encoding"));
//try {
byte b[] = null;
try {
b = "大家一起来学习java".getBytes("GBK");
} catch (UnsupportedEncodingException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}

OutputStream ak = null;
try {
ak = new FileOutputStream(new File("d:\\encoding.txt"));
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

try {
ak.write(b);
} catch (IOException e) {

e.printStackTrace();
}
try {
ak.close();
} catch (IOException e) {

e.printStackTrace();
}
}

}
发现运行后正常输出“大家一起来学习java”,UTF-8中文不是3字节,而GBK中文是两字节,为什么不会出现中文乱码,java刚开始接触,各种不懂~求大神解答

Java中UTF-8转GBK之所以不会出现中文乱码,是因为UTF-8编码为兼容性最大的字符集编码,它本身就支持中文字符。

Java代码转码范例:
String s = new String(ss.getBytes(),"GBK");
当你的内容本来就是正常的中文字符时,通过上面的语句转为GBK编码是不会有任何问题的,但如果你在转码之前的字符不是正确的中文字符,或者不是支持中文字符的字符集,那可能就会出现乱码问题。

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。

在Java开发中,特别是web开发,乱码是一种很常见而且很头疼的问题,这常常是由于页面端、服务端、数据库等几处所使用的字符不一致所致,故开发中,保持编码一致, 往往能减少由于乱码而带来的时间浪费,是一件非常重要的事情。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-12-11
你这本来就是正常的,b = "大家一起来学习java".getBytes("GBK");的意思就是让这个字符串按照gbk的编码正常显示。

你应该这样测试,写出到encoding.txt的时候用gbk编码,你设置ssa.java文件的编码为utf-8,然后读取encoding.txt里面的内容不做转换,直接显示追问

其实我不太明白 file.encoding到底是改变的是JVm编译时对XX.java文件的的编码方式还是什么?找个好多资料都说的挺含糊的

本回答被网友采纳
第2个回答  2013-12-11
亲爱童鞋,首先,乱码不是这么理解的。比如说前后台交互,发送方编码是UTF-8,接受方却是GBK,这样的话就会产生乱码,明白?就是说你的两边的编码格式不一致到时乱码产生。并不是说你这样转码之后就成乱码了。乱码的产生,和解决原理你没有明白。一般产出乱码的情况都是两边编码格式不一致导致的,所以你要清楚数据在交互过程中的底层编码。。。
第3个回答  2013-12-11
眼睛有点花。。暂时不看代码先。。你都说utf-8转成gbk了,都经过转换了为什么会出现乱码?就像你打开utf-8的txt,另存为gbk的,不会出现乱码的啊!只有你读取方式错误的话会出现乱码
第4个回答  2013-12-11
你把后面的.getBytes("GBK")去掉就知道会不会乱码了
相似回答