Java编译器在对源文件编译前,首先会源文件转换为unicode编码,然后再进行编译。例如:我们的源文件是以UTF-8的方式保存的,而在编译时编译器却把它当作是用GBK方式保存的,这样编译器就会按照GBK->Unicode的编码转换方法对源文件进行转换,然后再编译,这样当然会出错,实际上编译器应当按照UTF-8->Unicode的编码转换方法来对源文件进行转换。
通常我们手动建立一个java文件Demo.java,并保存。此时Demo.java文件的编码为ANSI,中文操作系统下就是GBK.然后使用javac命令来编译该源文件。”javac Demo.java”。Javac也需要读取java文件,那么javac是使用什么编码来解码我们读取的字节呢?其实javac采用了操作系统默认的GBK编码解码我们读取的字节,这个编码正好也是Demo.java文件的编码,二者一致,所以不会出现乱码情况。让我们来做点手脚,在保存Demo.java文件时,我们选择UTF-8保存。此时Demo.java文件编码就是UTF-8了。我们再使用”javac Demo.java”来编译,如果Demo.java里含有中文字符,此时控制台会出现警告信息,也出现了乱码。究其原因,就是因为javac采用了GBK编码解码我们读取的字节。因为我们的字节是UTF-8编码的,所以会出现乱码。如果不信的话你可以自己试试。那么解决办法呢?解决办法就是使用javac的encoding参数来制定我们的解码编码。如下:javac -encoding UTF-8 Demo.java。这里我们指定了使用UTF-8来解码读取的字节,由于这个编码和Demo.java文件编码一致,所以不会出现乱码情况了。
我习惯把Eclipse的编码设置成UTF-8。那么每个项目中的java源文件的编码就是UTF-8。这样编译也从没有问题,也没有出现过乱码。正是因为这样才掩盖了使用javac可能出现的乱码。那么Eclipse是如何正确编译文件编码为UTF-8的java源文件的呢?唯一的解释就是Eclipse自动识别了我们java源文件的文件编码,然后采取了正确的encoding参数来
编译我们的java源文件。功劳都归功于IDE的强大了。
输出再做一次转码
比如:Sysout.out.println(“我们”)。经过正确的解码后”我们”是unicode保存在内存中的,但是在向标准输出(控制台)输出时,jvm又做了一次转码,它会采用操作系统默认编码(中文操作系统是GBK),将内存中的unicode编码转换为GBK编码,然后输出到控制台。因为我们操作系统是中文系统,所以往终端显示设备上打印字符时使用的也是GBK编码。因为终端的编码无法手动改变,所以这个过程对我们来说是透明的,只要编译时能正确转码,最终的输出都将是正确的,不会出现乱码。在Eclipse中可以设置控制台的字符编码,具体位置在Run Configuration对话框的Common标签里,我们可以试着设置为UTF-8,此时的输出就是乱码了。因为输出时是采用GBK编码的,而显示却是使用UTF-8,编码不同,所以出现乱码。
总之:
编码有2个方面:一是源文件本身的编码;二是文件内的字符编码;
要保证没有乱码,首先必须保证,源文件编码与编译器编译时用的编码保持一致,这是不出现乱码的前提条件。然后再保证字符的编码与解码保持一致即可,例如:
import java.io.UnsupportedEncodingException;
public class Hee{
public static void main(String args[]){
String s="深深深是";
System.out.println(s);
try {
System.out.println(new String(s.getBytes("UTF-8")));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
第二次打印会出现乱码,可以思考一下为什么会出现乱码?
答案:它本身已经是UTF-8编码了,但却是按照GBK转换为unicode,然后再unicode转换为GBK,因此它会乱码显示,其它正常。
分享到:
相关推荐
实现自动检测源文件的编码类型,最终转换成统一的目标编码类型
Java写的一个小程序,用于批量转换GBK编码的java源文件为UTF-8编码格式
3.1 JAVA源文件(JAVA SOURCE FILES) 4 3.1.1 开头注释(Beginning Comments) 5 3.1.2 包和引入语句(Package and Import Statements) 5 3.1.3 类和接口声明(Class and Interface Declarations) 5 4 缩进排版...
3.1 Java源文件(Java Source Files)每个Java源文件都包含一个单一的公共类或接口 3.1.3 类和接口声明(Class and Int
3.1 Java源文件 o 3.1.1 开头注释 o 3.1.2 包和引入语句 o 3.1.3 类和接口声明 4 缩进排版 ? 4.1 行长度 ? 4.2 换行 5 注释 ? 5.1 实现注释的格式 o 5.1.1 块注释 o 5.1.2...
1.2.1 文件后缀名 表1-1 Java程序使用的文件后缀名 文件类别 文件后缀名 Java源文件 .java Java字节码文件 .class 其中两者最本质的区别在于,.Java文件是供虚拟机运行时执行的文件, 而.class文件可以让你在任何一...
在eclispe的项目中,有存在项目字符集和工作空间字符集不匹配,该jar只能将项目文件中的.java结尾的文件转为utf8编码,并且源文件必须为gbk编码的,否则乱码
一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个...
在编写JAVA源文件的时候要指定源文件的编码,这里是指源文件的文本以什么编码保存为操作系统中的文件。 JAVAC编译的时候要把源文件编译成class文件,先要读取源文件,这时候要以一种编码来解码读到的 ...
编码转换的类 含源代码, 适合编码转换时候使用 默认转换为UTF-8 可以转换成别的
当且仅当一个Java源文件符合此文档中的规则, 我们才认为 它符合Google的Java编程风格。 与其它的编程风格指南一样,这里所讨论的不仅仅是编码格式美不美观的问题, 同时也讨论一些约定及编码标 准。然而,这份文档...
超过2000行的程序难以阅读,应该尽量避免。"Java源文件范例"提供了一个布局合理的Java程序范例。
动态编译JAVA源文件 4 JAVA字节代码增强 6 JAVALANGINSTRUMENT 8 总结 9 参考资料 10 JAVA类的加载、链接和初始化 11 JAVA类的加载 11 JAVA类的链接 12 JAVA类的初始化 13 创建自己的类加载器 14 参考资料 15 JAVA...
一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一...
java源码 hacker
北京动力节点-Java编程零基础教程-009-Java语言概述-Java的工作原理-其它语言存在的问题.mp4 北京动力节点-Java编程零基础教程-010-Java语言概述-Java的工作原理-JVM的产生.mp4 北京动力节点-Java编程零基础教程-...
Java实验指导书.doc
本文深入分析了Java 程序设计中Java 编译器对java 源文件和JVM 对class 类文件的编码/解码过程,通过此过程的解析透视出了Java 编程中中文问题产生的根本原因,最后给出了建议的最优化的解决Java 中文问题的方法。
介绍了Java的命名规范,Java源文件样式,代码编程风格,程序编写规范,Struts编码规范,注释,编程实践问题等。