最近我在eclipse下测试中文字符的输入输出问题,发现eclipse下控制台的编码设置为utf-8时,当从eclipse控制台录入汉字后,会出现乱码问题。
虽然这个问题看起来在实践中用量不大,但是对于理解字符编码有作用的。
场景如下:
eclipse控制台编码设置为utf-8,设置位置如图:
再来设置file.encoding的编码,目的是为了设置java程序的默认编码。
测试程序如下:
public class CharsetCodingOutTest {
public static void main(String[] args) throws IOException{
System.out.println("平台使用默认编码:"+System.getProperty("file.encoding"));
System.out.println(Charset.defaultCharset());
/**
* 文件输入流,只要按照正确编码读取,就没有问题。
这么做的目的是为了测试后面的程序是否正确。真正需要做的是用键盘输入流代替文件输入流
*/
//InputStream is=new FileInputStream("d:\\test\\test_utf8.txt");
/**
* 键盘输入流
*/
InputStream is=System.in;
/**
* 下面的编码如果没有设置对的话,就会出现解码错误,以后就可能不能恢复了。
*
* 一般用ISO8859-1 和gbk来解码其它的字符编码,错误了,还可以恢复。
* 但是如果用utf-8 来解码utf-8或者用gb2312解码utf-8的字符编码,错误了,就不能恢复了。
*
* 总之用错编码解码时,只要能解码对应到任何一个存在的字符时,就可以恢复。
* 如果解码时,映射不到一个字符时,就会用?代替,这样就恢复不了啊。
*/
InputStreamReader isr=new InputStreamReader(is,"UTF-8");//,"UTF-8"
BufferedReader br = new BufferedReader(isr);
String s = br.readLine();
br.close();
//目前控制台编码是UTF-8,程序默认输出也是UTF-8,所以下面的输出应该是没有问题。除非读取的s字符串在InputStreamReader中解码错误了。
System.out.println(s);
//System.out.write(s.getBytes("GBK"));
//System.out.println();
//目前控制台编码是UTF-8,指定以UTF-8码输出到控制台,所以下面的输出应该是没有问题。除非读取的s字符串在InputStreamReader中解码错误了。
System.out.write(s.getBytes("UTF-8"));
}
}
如果是从一个utf-8的文件中读取汉字,然后输出到eclipse控制台,这个程序是没有问题的,可以正确输出汉字。
可是从eclipse的控制台下读取汉字,就会出现乱码。
所以键盘输入流的解码错误了,那么应该用什么编码进行解码读取呢。
我的思路是:
1、首先对键盘输入流读取的汉字进行解码,
2、然后jvm虚拟机会进行转换成unicode码加载到内存中,
3、jvm把unicoe转换成程序指定的编码,然后输出到控制台
4、控制台再用指定的编码进行显示。
请哪位高手指点迷津,帮我解决。