w.write(new String("中文网".getBytes("utf-8"),"GBK"));
这样的写法是不对的,保存在虚拟机中的不是utf-8编码,而是utf-8编码变种,虚拟机的内部编码是固定的,不会改变。
getBytes("utf-8")是把保存在虚拟机中的中文编码成utf-8格式,而不是虚拟机中本身就是utf-8编码,new String(byte,"gbk")也不是让虚拟机内部编码为gbk,而是虚拟机以gbk方式解析传入编码,然后将编码转换成内部编码(utf-8编码变种),根据这个道理,你用utf-8格式获得虚拟机内部编码类型,然后再用GBK解析utf-8格式的编码,当然不能解析。
所以如果你要获得gbk的编码,必须要getBytes("GBK")才行,然后解析就用new String(byte,"gbk");
你这种写法是有问题的 只有new String("中文网".getBytes("GBK"),"GBK")这种方法才正确,但是这么写又是没有意义的。
不过有一个形式例外,就是new String(str.getBytes("ISO-8859-1"),"GBK"),为什么呢,因为这他们其实是同一种编码方式,只不过一个以英文编码方式解析,一个以中文方式解析而已。而utf-8与gbk根本就是两种编码方式,是不能互相解析的。
在Java中,如果我们用java.io.FileReader或者java.io.FileWriter来读写文件的话,固然我们可以通过 java.io.BufferedReader和java.io.BufferedWriter来提高效率,但是我们会发现在FileReader和 FileWriter中我们只能获取编码方式,而不能设置。这样,在FileReader和FileWriter中的编码设置只能服从于一些更为底层的设置,那么在读写多种语言编码的文件时就很容易出现乱码。
另外一种方法就是采用java.io.FileInputStream/java.io.InputStreamReader和 java.io.FileOutputStream/java.io.OutputStreamWriter来解决这个问题。在 InputStreamReader和OutputStreamWriter中,可以通过指定编码方式来完成UTF-8文件的读写。
比如:
java.io.BufferedWriter writer = null;
java.io.FileOutputStream writerStream = new java.io.FileOutputStream(filename);
writer = new java.io.BufferedWriter(new java.io.OutputStreamWriter(writerStream, "UTF-8"));
// do something
// writing file
writer.close();
这样的写法是不对的,保存在虚拟机中的不是utf-8编码,而是utf-8编码变种,虚拟机的内部编码是固定的,不会改变。
getBytes("utf-8")是把保存在虚拟机中的中文编码成utf-8格式,而不是虚拟机中本身就是utf-8编码,new String(byte,"gbk")也不是让虚拟机内部编码为gbk,而是虚拟机以gbk方式解析传入编码,然后将编码转换成内部编码(utf-8编码变种),根据这个道理,你用utf-8格式获得虚拟机内部编码类型,然后再用GBK解析utf-8格式的编码,当然不能解析。
所以如果你要获得gbk的编码,必须要getBytes("GBK")才行,然后解析就用new String(byte,"gbk");
你这种写法是有问题的 只有new String("中文网".getBytes("GBK"),"GBK")这种方法才正确,但是这么写又是没有意义的。
不过有一个形式例外,就是new String(str.getBytes("ISO-8859-1"),"GBK"),为什么呢,因为这他们其实是同一种编码方式,只不过一个以英文编码方式解析,一个以中文方式解析而已。而utf-8与gbk根本就是两种编码方式,是不能互相解析的。
在Java中,如果我们用java.io.FileReader或者java.io.FileWriter来读写文件的话,固然我们可以通过 java.io.BufferedReader和java.io.BufferedWriter来提高效率,但是我们会发现在FileReader和 FileWriter中我们只能获取编码方式,而不能设置。这样,在FileReader和FileWriter中的编码设置只能服从于一些更为底层的设置,那么在读写多种语言编码的文件时就很容易出现乱码。
另外一种方法就是采用java.io.FileInputStream/java.io.InputStreamReader和 java.io.FileOutputStream/java.io.OutputStreamWriter来解决这个问题。在 InputStreamReader和OutputStreamWriter中,可以通过指定编码方式来完成UTF-8文件的读写。
比如:
java.io.BufferedWriter writer = null;
java.io.FileOutputStream writerStream = new java.io.FileOutputStream(filename);
writer = new java.io.BufferedWriter(new java.io.OutputStreamWriter(writerStream, "UTF-8"));
// do something
// writing file
writer.close();