在日文操作系统下的Eclipse中,把程序内码设为GB2312,文件中有含中文的字符串,java文件能正常编译,并且把中文字符串正常输出。但如果在日文操作系统的控制台下,把控制台的内码设为GBK。
用javac -encoding gb2312 ABC.java   来编译程序
用Java ABC 来运行程序
出现的打印出的中文内容确实乱码。但如果在中文操作系统的控制台下,
用javac ABC.java   来编译程序
用Java ABC 来运行程序
出现的打印出的中文内容是正常的。有哪位达人能够解释一下上面现象的原因吗?

解决方案 »

  1.   

    应该不会这么简单。
    我在日文系统下装了中文字库。另外,在eclipse下,把程序内码设为GB2312,也是能正常运行的。
      

  2.   

    因为楼主把问题描述的不太清楚,所以我干脆把整个过程说一遍……:1.
    将源代码文件保存成一种特定的编码(Microsoft Windows 记事本保存选项里可以选择),设为 E1;
    设控制台使用的编码为 E2(Microsoft Windows 控制面板里可以改变);2.
    源文件的内容(源文件使用 E1 编码)为 System.out.println("XXXXXX");
    确保 XXXXXX 中的每一个字符操作系统中都有已安装的字体文件可以将其显示出来;3.
    使用 javac -encoding E1 source.java 编译,如果 E1 == E2,可直接用 javac source.java;
    编译成字节码时,Java 将 使用 E1 编码的 XXXXXX 字符串 转换成 Java 自己的 Modified UTF-8 格式(可以使用 DataInputStream 和 DataOutputStream 的 readUTF 和 writeUTF 来存取这种格式)存到 .class 文件中。因此,不同于 C 语言,Java 在任何平台上的任何编译器上编译出来的 .class 文件都是平台独立的;4.
    执行时,Java 从 .class 文件中获取字符串,将其转换成 UTF-16 格式存入内存中;
    每一个 PrintWriter 内部都指明了一个编码格式,设为 E3,如果在创建 PrintWriter 时没有指定,或者使用的是 PrintStream(比如 System.out),那么 E3 = E2;
    Java 将内存中的字符串转换成 E3 格式的字节流,然后输出给控制台;5.
    控制台使用它自己的 E2 格式解码,如果 E3 != E2,就不能正常解码,常表现为出现乱码;
    如果 E3 == E2,但是 XXXXXX 中存在一些字符,操作系统中没有对应的字体文件,则打印出一个特定的占位符。
      

  3.   

    附加信息:Eclipse有一个自己的控制台,独立于系统控制台,所以它们两个的控制台编码(E2)可能是不同的。
      

  4.   

    你将程序的编码(包括JAVA文件,xml文件)都改成Unicode/UTF-8,这样就不会乱了,GB-2312是GBK的子集,属于汉字编码,所以除了汉字以外的多字节编码都会乱!用UTF-8编码方式的话,就不会出现这样的问题
      

  5.   

    我现在需要测试在日文环境下是否能编辑和运行中文的文件,所以需要这么测试。
    而且,即使是改成了UTF-8的编码也是在eclipse下能正常运行,在dos下也不能正常运行,可能还是牵涉到了别的转码问题。
      

  6.   

    你的讲解很明确,但是我试完后还是不对,不知道哪个地方理解不正确。
    以下是我修改后的程序,修改点是增加了指定为中文编码的输出流:import java.io.PrintStream;
    import java.io.PrintWriter;
    public class TestCN{
    public static void main (String args[]){
    try{
    PrintWriter pw = new PrintWriter(System.out,true);
    PrintStream ps = new PrintStream(System.out, true, "GBK"); 
    ps.println("欢迎。");
    ps.println("HelloWorld");
    System.out.println("欢迎。");
    System.out.println("HelloWorld!");
    }catch(Exception e){
    e.printStackTrace();
    }
    }
    }
    这个程序在中文控制台下能正常打印。
    在日文操作系统的eclipse下也能正常打印。
    但在日文操作系统的控制台下,中文内容不能正常打印。我在日文操作系统的控制台的操作是:
    编译程序:
    javac -encoding GBK TestCN.java
    运行程序 :
    javac TestCN.java
    运行的控制台的属性的current code page设为了:936(simplified Chinese GBK)
    从运行结果上看,指定编码的输出流和没有指定编码的输出流的乱码是不一样的。
      

  7.   

    你要把 源代码文件 保存成 GBK 编码格式而不是 系统默认编码格式(Microsoft Windows 记事本默认的 ANSI 选项),可以使用一个稍微高级一点的文本编辑器。然后再用 javac -encoding GBK Test.java。那个 -encoding 是指定源代码文件的编码的。然后你不要改变控制台的编码,直接使用 System.out.println,Java 会自动按照控制台的编码来转换输出。之后如果还有问题,有可能是存在有些字符不能用控制台使用的编码来表示,或者有些字符没有字体显示,或者干脆因为控制台不能输出宽字符(我用过的英文 Microsoft Windows 操作系统和 Unix 就存在这种问题)。
      

  8.   


    把源代码文件保存成GBK编码格式,这点没有问题,我使用UE来做的,我用GBK的码表对照确认过。
    不改变控制台的编码,我的控制台的默认编码是ms932(也就是日文编码),不改应该不能正确显示吧。
    不过我按照你的方式改完后还是不能正常打印出来。郁闷了,不过输入文件是可以的。你用过的英文 Microsoft Windows 操作系统和 Unix有这个问题,是因为系统没有安装中文字库吗?或者说不能把控制台的字符集设为中文?