我的机器配置环境如下:
系统: Ubuntu 9.04
系统默认字符集: UTF-8程序的字符环境如下
文件字符集: gb2312程序如下:
class Hello
{
public static void main(String[] s)
{
String str = "大家好";
System.out.println(str);
}
}编译过程如下
javac -encoding gb2312 Hello.java运行如下:
java Hello显示如下:
1. 当终端默认字符集为UTF-8时:         显示中文"大家好"
2. 当终端默认字符集为GB2312时:     显示乱码"澶у�跺ソ" 请问,我明明是用的gb2312的文件格式,gb2312的编译,但是最后却是UTF-8正确显示中文,GB2312显示乱码?
那么我输出的是UTF-8的还是GB2312的字符串?

解决方案 »

  1.   

    程序内部使用的字符集(无论是控制台参数还是程序内部定义的字符串变量),均以控制台编码为准;
    程序外部使用的字符集(例如提供给System.out的字符串),必须以系统默认编码为准;
    不管内部还是外部使用的字符集均与Java源程序文件的字符编码无关。你所提供的例子是将程序内部使用的字符集直接应用到程序外部,如果两者的字符编码一致则没有问题,如果不一致则出现乱码。
    当系统默认编码是UTF-8,控制台编码是GB2312时,可用以下代码进行转换:String str = "大家好";
    String tmp = new String(str.getBytes("GB2312"), Charset.defaultCharset());
    System.out.println(tmp);
      

  2.   


    那么我那种情况下,直接定义的String str = "大家好"; 这个在程序里的编码就已经是GB2312喽?
      

  3.   

    补充一点,我查了java命令的所有参数,没有指定控制台编码的位置。
    在eclipse开发平台中,控制台编码的指定如下:
    不知道你的开发环境如何?可以这样理解,所谓控制台编码是eclipse为测试JAVA应用程序准备的。在正式运行JAVA程序的场合下,程序内部只有一种编码方式,就是系统默认编码。该值可以通过下述代码取得:Charset charset = Charset.defaultCharset();
      

  4.   

    问题暂时终结:
        把系统的编码设置为zh_CN.GB2312之后,终端在GB2312之下能正确识别GB2312的编码,原因正在研究中。