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或UTF-8,这可能导致在合并代码或在不同环境中运行时出现乱码...
### DES加密Java源文件知识点解析 #### 一、概述 数据加密标准(Data Encryption Standard,简称DES)是一种对称加密算法,广泛应用于信息安全领域。它最初由IBM开发,并于1977年被美国国家标准局采纳为官方标准。...
本文介绍了如何在Eclipse中设置正确的字符编码,包括设置工作空间编码、指定Java源文件编码以及解决输出时的编码问题。通过遵循这些步骤,开发者可以有效避免汉字编码问题带来的困扰,提高代码的兼容性和可用性。
在Java源文件的具体编码方面,开头注释是必需的,其中应包含类名、版本信息、日期和版权声明等。之后应该是包声明和导入语句,然后才是类和接口的声明。这些声明应包含文档注释和相应的注解,以说明类和接口的用途。...
java获取文件原始编码,
在这个`HJQFileUtils`类中,`convertEncoding`方法接收源文件路径、目标文件路径、源编码和目标编码作为参数。它创建了输入和输出的文件通道,并分别使用`CharsetDecoder`和`CharsetEncoder`进行解码和编码。使用...
Java源文件(`.java`)的编码通常由`javac`编译器根据操作系统的区域设置自动识别。如果源文件使用了非默认编码,比如GBK,而在英文环境下编译,可能会导致乱码。为了避免这类问题,可以使用`-encoding`选项强制指定...
1. **JAVA源文件组织约定**:每个Java源文件应对应一个公共类,并且文件名应与公共类的完全限定名一致。源文件中除了主要的公共类,还可以包含静态导入、常量和私有辅助类。 2. **命名约定**:变量、类、接口、方法...
Java Class源文件查看工具是Java开发者在处理已编译的.class文件时不可或缺的辅助工具,主要用于将二进制的.class文件转换回可读性更强的.java源代码文件。这种过程通常被称为反编译。反编译对于理解第三方库的内部...
1. **JAVA源文件编码**:确保你的JAVA源文件是以UTF-8编码保存的。大多数现代IDE(包括eclipse)允许你设置文件的编码格式。你可以检查并设置eclipse的工作空间和项目的编码为UTF-8。 2. **编译过程**:在命令行...
最后,在代码范例(CodeExamples)部分,通过具体的Java源文件示例,展示了如何将前面提到的编码规范应用到实际编程实践中。 整个文档强调了编码规范对团队协作和代码质量的影响,提供了一系列具体的编码规则,并...
Java写的一个小程序,用于批量转换GBK编码的java源文件为UTF-8编码格式
腾讯 Java 编码规范 腾讯 Java 编码规范是腾讯集团管理标准的一部分,旨在确保公司项目代码的易维护性和编码安全性。该规范涵盖了 Java 编码风格、文件组织、代码风格、注释、命名、声明、异常、习惯等方面。 一、...
1. **源文件编码**:确保使用支持中文的编码(如UTF-8)来编写和保存Java源文件,避免依赖于操作系统默认的编码格式。 2. **编译阶段**:在编译时,通过命令行参数指定源文件的编码格式,例如`javac -encoding UTF-...
1. **源文件编码**:Java源文件(`.java`)在保存时通常采用操作系统默认的编码格式。例如,在中文Windows上使用记事本编辑并保存Java源文件时,默认使用GBK编码。 2. **编译过程中的编码转换**:Java编译器(`...
// 源文件编码 String targetEncoding = "UTF-8"; // 目标文件编码 try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(sourceFilePath), sourceEncoding)); ...
1. **Java源文件结构**:一个Java源文件可以包含一个公共类(public class)和多个非公共类(non-public classes)。公共类的名称必须与文件名相同,并且大小写敏感。 2. **Java包(Package)**:Java包是用来组织...
Java编码问题一直是开发者在处理中文字符时经常遇到的挑战,尤其是在Web应用中。Java使用Unicode作为内部字符存储标准,处理字符时涉及两次编码转换:从源输入流按指定编码读取,转换为Unicode,再从Unicode编码转换...
文件组织部分定义了Java源文件的基本结构和布局,包括文件的组成部分及其顺序。 ##### 2.1 Java源文件 - **单一公共类或接口**:每个Java源文件应只包含一个公共类或接口。如果存在与公共类紧密相关的私有类或接口...
本资料将深入探讨Java中的汉字编码问题,帮助开发者理解并解决可能出现的乱码现象。 首先,我们需要理解编码的基本概念。编码是将字符转换为二进制表示的过程,而解码则是相反的过程。在Java中,最常用的字符编码...