`

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源文件编码转换工具是一种实用程序,用于解决在处理不同编码格式的源代码时遇到的问题。在软件开发中,源代码文件可能以多种编码格式存储,例如GBK或UTF-8,这可能导致在合并代码或在不同环境中运行时出现乱码...

    DES加密 java源文件

    ### DES加密Java源文件知识点解析 #### 一、概述 数据加密标准(Data Encryption Standard,简称DES)是一种对称加密算法,广泛应用于信息安全领域。它最初由IBM开发,并于1977年被美国国家标准局采纳为官方标准。...

    java中汉字编码问题

    本文介绍了如何在Eclipse中设置正确的字符编码,包括设置工作空间编码、指定Java源文件编码以及解决输出时的编码问题。通过遵循这些步骤,开发者可以有效避免汉字编码问题带来的困扰,提高代码的兼容性和可用性。

    Java语言编码规范

    在Java源文件的具体编码方面,开头注释是必需的,其中应包含类名、版本信息、日期和版权声明等。之后应该是包声明和导入语句,然后才是类和接口的声明。这些声明应包含文档注释和相应的注解,以说明类和接口的用途。...

    java获取文件编码

    java获取文件原始编码,

    Java文件编码转换源码

    在这个`HJQFileUtils`类中,`convertEncoding`方法接收源文件路径、目标文件路径、源编码和目标编码作为参数。它创建了输入和输出的文件通道,并分别使用`CharsetDecoder`和`CharsetEncoder`进行解码和编码。使用...

    Java中文编码问题小结

    Java源文件(`.java`)的编码通常由`javac`编译器根据操作系统的区域设置自动识别。如果源文件使用了非默认编码,比如GBK,而在英文环境下编译,可能会导致乱码。为了避免这类问题,可以使用`-encoding`选项强制指定...

    JAVA基本编码规范

    1. **JAVA源文件组织约定**:每个Java源文件应对应一个公共类,并且文件名应与公共类的完全限定名一致。源文件中除了主要的公共类,还可以包含静态导入、常量和私有辅助类。 2. **命名约定**:变量、类、接口、方法...

    java class源文件查看工具

    Java Class源文件查看工具是Java开发者在处理已编译的.class文件时不可或缺的辅助工具,主要用于将二进制的.class文件转换回可读性更强的.java源代码文件。这种过程通常被称为反编译。反编译对于理解第三方库的内部...

    JAVA编码问题[借鉴].pdf

    1. **JAVA源文件编码**:确保你的JAVA源文件是以UTF-8编码保存的。大多数现代IDE(包括eclipse)允许你设置文件的编码格式。你可以检查并设置eclipse的工作空间和项目的编码为UTF-8。 2. **编译过程**:在命令行...

    JAVA程序编码规范.pdf

    最后,在代码范例(CodeExamples)部分,通过具体的Java源文件示例,展示了如何将前面提到的编码规范应用到实际编程实践中。 整个文档强调了编码规范对团队协作和代码质量的影响,提供了一系列具体的编码规则,并...

    java文件编码转换

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

    腾讯java编码规范

    腾讯 Java 编码规范 腾讯 Java 编码规范是腾讯集团管理标准的一部分,旨在确保公司项目代码的易维护性和编码安全性。该规范涵盖了 Java 编码风格、文件组织、代码风格、注释、命名、声明、异常、习惯等方面。 一、...

    java编码格式(对常见的java中文乱码作出分析及提出解决方案)

    1. **源文件编码**:确保使用支持中文的编码(如UTF-8)来编写和保存Java源文件,避免依赖于操作系统默认的编码格式。 2. **编译阶段**:在编译时,通过命令行参数指定源文件的编码格式,例如`javac -encoding UTF-...

    java中文乱码问题详解--- java中文乱码问题详解

    1. **源文件编码**:Java源文件(`.java`)在保存时通常采用操作系统默认的编码格式。例如,在中文Windows上使用记事本编辑并保存Java源文件时,默认使用GBK编码。 2. **编译过程中的编码转换**:Java编译器(`...

    用java修改文件的编码

    // 源文件编码 String targetEncoding = "UTF-8"; // 目标文件编码 try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(sourceFilePath), sourceEncoding)); ...

    fck java 源文件

    1. **Java源文件结构**:一个Java源文件可以包含一个公共类(public class)和多个非公共类(non-public classes)。公共类的名称必须与文件名相同,并且大小写敏感。 2. **Java包(Package)**:Java包是用来组织...

    JAVA编码问题.pdf

    Java编码问题一直是开发者在处理中文字符时经常遇到的挑战,尤其是在Web应用中。Java使用Unicode作为内部字符存储标准,处理字符时涉及两次编码转换:从源输入流按指定编码读取,转换为Unicode,再从Unicode编码转换...

    Java语言编码规范.docx

    文件组织部分定义了Java源文件的基本结构和布局,包括文件的组成部分及其顺序。 ##### 2.1 Java源文件 - **单一公共类或接口**:每个Java源文件应只包含一个公共类或接口。如果存在与公共类紧密相关的私有类或接口...

    java应用中的汉字编码问题

    本资料将深入探讨Java中的汉字编码问题,帮助开发者理解并解决可能出现的乱码现象。 首先,我们需要理解编码的基本概念。编码是将字符转换为二进制表示的过程,而解码则是相反的过程。在Java中,最常用的字符编码...

Global site tag (gtag.js) - Google Analytics