`

java源文件编码问题

 
阅读更多

 

     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源文件编码转换工具加源码(自动检测源文件编码类型)

    实现自动检测源文件的编码类型,最终转换成统一的目标编码类型

    java文件编码转换

    Java写的一个小程序,用于批量转换GBK编码的java源文件为UTF-8编码格式

    Java语言编码规范

    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 缩进排版...

    Java编码规范1

    3.1 Java源文件(Java Source Files)每个Java源文件都包含一个单一的公共类或接口 3.1.3 类和接口声明(Class and Int

    Java语言编码规范[含书签]

    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...

    Java高级程序设计实战教程第一章-Java编码规范.pptx

    1.2.1 文件后缀名 表1-1 Java程序使用的文件后缀名 文件类别 文件后缀名 Java源文件 .java Java字节码文件 .class 其中两者最本质的区别在于,.Java文件是供虚拟机运行时执行的文件, 而.class文件可以让你在任何一...

    .java文件中GBK编码转UTF-8编码

    在eclispe的项目中,有存在项目字符集和工作空间字符集不匹配,该jar只能将项目文件中的.java结尾的文件转为utf8编码,并且源文件必须为gbk编码的,否则乱码

    JAVA上百实例源码以及开源项目源代码

     一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个...

    JAVA中的字符编码操作

     在编写JAVA源文件的时候要指定源文件的编码,这里是指源文件的文本以什么编码保存为操作系统中的文件。  JAVAC编译的时候要把源文件编译成class文件,先要读取源文件,这时候要以一种编码来解码读到的  ...

    JAVA编码转换一个类 源代码

    编码转换的类 含源代码, 适合编码转换时候使用 默认转换为UTF-8 可以转换成别的

    Google java编程指南

    当且仅当一个Java源文件符合此文档中的规则, 我们才认为 它符合Google的Java编程风格。 与其它的编程风格指南一样,这里所讨论的不仅仅是编码格式美不美观的问题, 同时也讨论一些约定及编码标 准。然而,这份文档...

    java编程命名规范和编码规范

    超过2000行的程序难以阅读,应该尽量避免。"Java源文件范例"提供了一个布局合理的Java程序范例。

    java深度历险

    动态编译JAVA源文件 4 JAVA字节代码增强 6 JAVALANGINSTRUMENT 8 总结 9 参考资料 10 JAVA类的加载、链接和初始化 11 JAVA类的加载 11 JAVA类的链接 12 JAVA类的初始化 13 创建自己的类加载器 14 参考资料 15 JAVA...

    java源码包---java 源码 大量 实例

     一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一...

    java源码hacker-HackerRank:所有具有竞争力的编码Java源文件

    java源码 hacker

    125集专攻JAVA基础 JAVA零基础入门学习视频教程 动力节点JAVA视频教程.txt

    北京动力节点-Java编程零基础教程-009-Java语言概述-Java的工作原理-其它语言存在的问题.mp4 北京动力节点-Java编程零基础教程-010-Java语言概述-Java的工作原理-JVM的产生.mp4 北京动力节点-Java编程零基础教程-...

    Java实验指导书.doc

    Java实验指导书.doc

    深入剖析Java 编程中的中文问题及建议最优解决方法

    本文深入分析了Java 程序设计中Java 编译器对java 源文件和JVM 对class 类文件的编码/解码过程,通过此过程的解析透视出了Java 编程中中文问题产生的根本原因,最后给出了建议的最优化的解决Java 中文问题的方法。

    Java编程规范.doc

    介绍了Java的命名规范,Java源文件样式,代码编程风格,程序编写规范,Struts编码规范,注释,编程实践问题等。

Global site tag (gtag.js) - Google Analytics