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. (30)批处理文件.bat

    批处理文件(bat) 简单的说,批处理的作用就是自动的连续执行多条命令 .编写bat处理文件可以使用记事本的方式: 常见批处理文件的命令: echo 表示显示此命令后的字符 tiltle 设置窗口的标 ...

  2. css颜色代码对照

    FFFFFF #DDDDDD #AAAAAA #888888 #666666 #444444 #000000 #FFB7DD #FF88C2 #FF44AA  #FF0088  #C10066  #A ...

  3. JIRA6.36-7.23数据迁移文档

    JIRA6.3.6-JIRA7.2.3数据迁移文档 安装JIRA7.2.3 安装包位于服务器/opt/SOFTWARE_PACKAGE目录下 建立JIRA安装的目录数据目录 cd /opt mkdir ...

  4. java实现8种排序算法(详细)

    八种排序分别是:直接插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 希尔排序在时间性能上优于直接插入排序,但希尔排序是一种不稳定排序. 快速排序的时间性能也优于冒泡 ...

  5. CentOS下查看nginx和php的编译参数

    在已经编译安装好的nginx和php的server上是可以查看之前编译时候的参数的,方法如下. 1.查看nginx的编译参数 # nginx -V nginx version: nginx/1.9.4 ...

  6. D3.js-坐标轴生成测试SVG

    Bottom top Bottom top   // =0) return "translate("+margin+","+i*offset+")&q ...

  7. 老李推荐: 第14章2节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer架构概述

    老李推荐: 第14章2节<MonkeyRunner源码剖析> HierarchyViewer实现原理-HierarchyViewer架构概述   HierarchyViewer库的引入让M ...

  8. 手机自动化测试:appium源码分析之bootstrap五

    手机自动化测试:appium源码分析之bootstrap五   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest测试 ...

  9. liunx文件与用户和群组

    文件基本属性 在图片中alogrithm的文件属性为drwxrwxr-x,其中d代表此文件为目录. 后面rwx,rwx,r-x分别代表文件所属者(ower),组(group),其他用户(other)的 ...

  10. Wpf学习之路……

    Wpf学习之路-- Wpf是 .net中一门做winform的技术,和传统的winform的区别在于: 1.         原来的winform就是拖控件,而wpf的控件都死自己拿标记语言(xaml ...