Windows下编译Java源文件的编码错误


一、问题描述

==================

import java.util.Arrays;
public class ArrayAsAReference{
public static void main(String[] args)
{
int[] arr = null;
System.out.println(arr);
arr = new int[]{1, 2, 3, 4}; // 静态创建数组对象
System.out.println(Arrays.toString(arr));
int[] prices;
prices = new int[5]; // 动态创建数组对象
System.out.println(Arrays.toString(prices));
System.out.println(); //使用普通循环遍历数组对象
for(int i = 0; i < prices.length; i++) {
System.out.println("prices[" + i + "] = " + prices[i]);
}
System.out.println(); //使用foreach循环遍历数组对象
for (int price : prices)
{
System.out.println("price:" + price);
}
}
}

  

然后在cmd.exe里用javac去编译,出现了如下的错误:

 
 二、分析解决
=========
 
出现这种情况,表面原因是源文件中有GBK不可映射字符。根据这个信息可以得知源代码的字符编码不是GBK的,所以其中的一些字符不可映射为GBK编码,所以解决方法是很明显的,那就是把源代码的编码格式转换为GBK编码的。具体在notepad++中也很简单:选中目标源代码文件的tab,点击“格式”->“转为ANSI编码格式”,保存,再编译,这时候编译就可以通过了。
 
这个问题可以通过把源代码的编码方式转为GBK编码解决,但是如果我就是不想转,就是要用源代码本来的编码方式去编译该怎么做呢?
那就得在编译的时候用-encoding 参数来指定源代码的编码格式。比如,本例中通过notepad的格式菜单可以看到源代码本来的编码格式是utf-8,那么就可以这样编译:javac -encoding utf-8 ArrayAsAReference.java,也可以顺利的编译通过。
 
总之,如果在编译阶段出现编码问题,更为一般的解决方法就是搞清楚源程序的编码格式,通过-encoding参数指定源程序的编码格式,就肯定可以编译通过。
 
三、问题延伸
=========
 
源代码的编码格式为什么会引起编译错误呢?这个问题涉及到javac对源代码的编码格式处理方法。

在编译的时候,如果没有用-encoding参数指定java源程序的编码格式,则javac.exe认为源代码的编码格式是操作系统默认的编码格式,所以就会用按照操作系统默认的编码格式去处理源代码。上面由于windows下默认编码格式是GBK,编译的时候没有javac就会把ArrayAsAReference.java当成GBK编码的文件,但是实际上ArrayAsAReference.java是utf-8格式,所以转换就出现了错误。

javac编译源代码的是时候会先按照源程序的编码格式读取源程序,编译,编译生成.class类文件,此时.class文件也是unicode编码的,它暂放在内存中,最后javac将unicode编码的class文件保存到操作系统中形成.class文件。

因此,编码问题只会出现在编译阶段,而在运行阶段用java命令去执行class文件的时候从来不会出现编码问题,因为编译后的class文件必然是unicode编码的。

windows下编译java源文件的编码错误的更多相关文章

  1. bundler-sfm windows下编译过程中出现的错误

    一.“sysdep1.h”文件缺失 错误提示: fatal error C1083: 无法打开包括文件: “sysdep1.h”: No such file or directory 这些作为这个软件 ...

  2. windows下编译Hugin时的template错误

    Hugin依赖于VIGRA,而VIGRA包含大量的模板,编译Hugin是出现如下的大量错误: "unexpected token(s) preceding ':'; skipping app ...

  3. 基于Windows下处理Java错误:编码GBK的不可映射字符的解决方案

    基于Windows下处理Java错误:编码GBK的不可映射字符的解决方案 最近在研究Java,涉及命令行编译,使用notepad++编辑器,然后使用javac编译: 之前的几个文件没有中文的内容,都没 ...

  4. 在Windows下编译FFmpeg详细说明

    MinGW:一个可自由使用和自由发布的Windows特定头文件和使用GNC工具集导入库的集合,允许你生成本地的Windows程序而不需要第三方C运行时 MinGW,即 Minimalist GNU F ...

  5. Windows下编译objective-C

    Windows下编译objective-C 2011-08-31 14:32 630人阅读 评论(0) 收藏 举报 windowscocoa工具objective clibraryxcode   目录 ...

  6. 在Windows下编译OpenSSL(VS2005和VC6)

    需要说明的是请一定安装openssl-0.9.8a .  openssl-1.0.0我没有编译成功. 如何在Windows下编译OpenSSL (Vs2005使用Vc8的cl编译器)1.安装Activ ...

  7. ubuntu下编译java程序

    ubuntu下编译java程序 首先需要安装jdk,并配置好相应环境变量 下面以简单的HelloWorld为例 文件名为HelloWorld.java java代码: public class Hel ...

  8. (转)Memcached 在windows下的java使用

    Memcached 在windows下的java使用   研究这个东东主要是为了解决在教务管理中选课系统的大并发情况下数据库频繁读写造成速度慢的问题,但要使用WEB服务器的内存,是不是可靠还需要验证, ...

  9. Windows下编译安装 FFmpeg

    在Linux/Mac下编译 ffmpeg是非常方便的.但要在 Windows下编译 ffmpeg还真要花点时间.以下就是在 Windowns下编译ffmpeg的步骤: 一.安装Cygwin 在wind ...

随机推荐

  1. 如何在container中编译dotnet的eShopOnContainers

    准备的软件   问题 Image下载问题 以下就是为啥要有最后一个软件(我是使用版): SQLSever for Linux 内存需求 需要编译Image   成功搞定 参考 Welcome to t ...

  2. 联想A7600-m刷机心得

    先来说说刷机 联想A7600-m的刷机

  3. 第一章 开发简单Java应用程序

    1. 什么是程序?     程序一词来自生活,通常指完成某些事务的一种既定方式和过程(一组有序指令的集合). 2. Java的三个领域? Java SE:java技术核心(指桌面应用程序)如:QQ.百 ...

  4. java学习笔记 --- 面向对象2

    一.匿名对象 (1)没有名字的对象 (2)应用场景   A:调用方法,仅仅只调用一次的时候. class Car { //描述属性.颜色,轮胎数. String color; int number; ...

  5. Angular4.0.0正式版发布

    来源于angular4.0.0发布时的公告,译者:niithub 原文发布时间:Thursday, March 23, 2017 翻译时间:2017年3月24日 angular4.0.0正式版现在可以 ...

  6. Gson和Json

    一下内容为复制别人的: Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库.可以将一个 JSON 字符串转成一个 Java 对象,或者反过来. j ...

  7. HTTP认证

    参考博文:HTTP协议详解 HTTP请求报头: Authorization HTTP响应报头: WWW-Authenticate HTTP认证是基于质询/回应(challenge/response)的 ...

  8. maven修改远程和本地仓库地址

    简介:我们用maven的时候,maven自带的远程中央仓库经常会很慢,还有默认本地仓库是在c盘C:\Users\你的电脑用户账号\.m2\repository, 对于有强迫症的人,总是看的不爽,下面介 ...

  9. Appium手势密码滑动之Z字形走势(java篇)

    1.直接使用负的偏移量appium会报错,在后面加上moveto(1,1)就行了 2.直接看图说话 废话少说看代码如: List<AndroidElement> element = dri ...

  10. Twitter数据抓取的方法(一)

    Scraping Tweets Directly from Twitters Search Page – Part 1 Published January 8, 2015 EDIT – Since I ...