java的IO流乱码问题

以下Demo.java文件,在eclipse里面,文件的属性为UTF-8。
---------------------------------------------------------------------------------------------------------------
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

public class Demo
{
public static void main(String[] args) throws IOException
{
System.err.println("Java虚拟机的默认 charset:"+Charset.defaultCharset());
InputStreamReader inputStreamReader = new InputStreamReader(System.in);
System.err.println("此流使用的字符码表名称:"+inputStreamReader.getEncoding());
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
while((str = bufferedReader.readLine())!= null)
{

System.err.println(str);
}
}
}
-----------------------------------------------------------------------------------------------------------------------
程序的功能是在控制台里面输入文字并且显示出来。当以上程序放到eclipse里面运行,然后在控制里面输入文字啊啊啊啊“之后,显示的结果会是乱码,到底是什么原因我至今未能搞明白,而且所有的码表我用的都是UTF-8,都是正确对应的,为啥会出现乱码,求高手告知。程序的运行结果如下所示。
这个程序的含金量还是很高的,解决乱码问题不难,难就难在知道他出现乱码的原理。
我告诉你,你在while循环里面的输出语句前加上这行代码:str = new String(str.getBytes("GBK"),"UTF-8");
你会发现,乱码解决了。根据这行代码的解释,可以从这行代码中知道,之所以用显示乱码的原因是,字符串 在输出的时候使用了GBK“解码”,需要把GBK“编码”回原始状态,再用UTF“解码”即可解决乱码问题。
那么问题来了。前面的的java虚拟机默认charset是UTF-8,此流使用的字符码表也要使用UTF-8,也就是字节流通向字符流的“解码”过程也是用UTF-8。那么从头到位用的都是UTF-8,为什么偏偏输出的时候会出现GBK呢???求解释。。要深入理解这个程序,得对编码解码有很深的理解才行,这个也是我困惑的地方!!

你将eclipse的编码集也改成UTF-8试试

追问

改了也不行。你跑一下我这份代码就知道了,确实不知道是在哪个地方出现了问题

追答

我这边没问题

追问

你用是GBK编码,我要求用是UTF-8编码,你注意看我输出的结果。java虚拟机默认charset要UTF-8。此流使用的字符码表也要使用UTF-8,demo.java文件属性也是utf-8属性。你看看你那边能不能

追答

这边也会乱码,因为我一直用的是GBK,你那个也是编码的问题,并不是程序的问题

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-07-02
Run Configurations->Common->Encoding这里的编码改为utf-8试试。如果还不行,那就在eclipse.ini里加一句-Dfile.encoding=UTF-8,重启eclipse再试试。

相似回答