java初学者关于DOS控制台输出中文时乱码的问题

2024-11-25 17:24:45
推荐回答(2个)
回答1:

亲爱的朋友,你好!

  1. Java编译器只支持ANSI编码的源文件,无论源文件有没有BOM,也无论源文件使用了什么编码,Java编译器都以ANSI编码的方式读取源文件(注意,含有BOM的源文件将出现编译错误,UTF-16编码的源文件也会出现编译错误)。这一点不同于C/C++编译器,VC和GCC编译器都支持含有BOM的UTF-8编码的源文件。(DOM?BOM!)

  2. Java编译器以ANSI(Windows简体中文版操作系统的ANSI编码为GBK)编码的方式读取Java源文件进行编译,将源代码中的字符串(String)和字符(char)以UTF-8的形式存储在生成的字节码.class文件中。(注意:根据JDK API文档,Java语言以UTF-16的形式表示字符和字符串。然而事实上,Java字节码文件却以UTF-8的形式存储字符和字符串。)

  3. 源文件中使用UTF-8编码的字符串,调用println函数发往控制台的也是UTF-8编码的字符串;源文件中使用ANSI编码的字符串,调用println函数发往控制台的还是ANSI编码的字符串;

  4. 为什么会乱码?因为DOS控制台并不像记事本那样能够自动识别字符串的编码,DOS控制台以预设的编码对字符串进行解析并加以显示。DOS中用于解析字符串的编码我们是可以自主设置的,在DOS窗口的标题栏右击,选择”默认值“,在对话框中的”默认代码页“中可以设置”GBK“或者”OEM-美国“为DOS默认的编码。你说的不错,DOS控制台确实不支持UTF-8的编码格式。

  5. 为什么输出英文字符串就没问题?因为UTF-8字符集和ANSI字符集都是ASCII字符集的超集,使用无BOM的UTF-8保存Java源文件,非ASCII字符只可能出现在字符串或字符中,而不会出现在源文件的其他位置,所以编译器并不会报错。UTF-8编码一般使用三个字节表示中文字符,ANSI编码使用2个字节表示中文字符。你的推理能力很好很强大,UTF-8的英文编码与ANSI是完全一样的。

  6. BOM,Byte Order Mark,字节顺序标记。BOM其实很简单,就是文本文件开头的几个具有特殊含义的字节,例如,UTF-8的BOM是EF BB BF。以前文本文件是没有BOM的,以什么编码解析文本文件只能由文本编辑器自动判断,可是文本编辑器有时候会判断失误,使文本文件不能被正确读取。为了解决此问题,人们就发明了BOM,用BOM来标记文本文件使用的字符编码,这样文本编辑器就可以以BOM所代表的字符编码正确读取文本文档了。

  7. 朋友,字符编码的知识一两句话是说不清楚的,需要自己努力的学习与体会。Java语言建立于虚拟机之上,即使从事Java开发多年的程序员,也未必精通字符编码的知识。

回答2:

首先,你的操作系统肯定是中文环境下,所以你使用记事本的话,就按照GBK对文字进行编码。

但是你现在用notepad的话,因为这个老外开发的,所以会按照ISO-8859来对数据进行编码,但是显示的时候又会按照GBK来进行编码,所以就会出现乱码。

英文之所以没问题是因为所有的字符集(ISO-8859,GBK,UTF-8,ASC||)等,对英文的编码都是相同的,所以英文绝对不会乱码的。但是GBK,UTF-8字符集中才包含中文字符,ISO-8859,ASC||不包含中文字符,所以会出现乱码。

关于乱码怎么解决你学习到IO流的时候自然就都会了,一两句话也说不清。