javac对unicode编码的支持程度测试

试验结论:
1. javac支持源文件为unicode编码,但是要求文件开头不能带有BOM(Byte Order Marker),否则编译就会失败
2. 对于系统默认编码不需要添加 -encoding选项,对于Unicode编码需要添加-encoding选项, 具体如下:
    utf8     : -encoding utf8
    utf16le  : -encoding utf-16le
    utf16be : -encoding utf-16be

试验所使用工具:
1. notepad++
   notepad++转换编码默认都带有BOM,对于unicode编码,它只能识别带有BOM的unicode文件
2. uconv
  它能够将一个文件转换为另一种编码,但要求文件不得带有BOM
  简单用法:uconv -f fromEncoding -t toEncoding  -o outputfile inputfile


测试代码如下:

// file name : Test.java

 1 package pkg;
 2 
 3 // 注释
 4 public class Test {
 5         final static int value = 1;
 6 
 7         /**
 8          * @param args
 9          */
10         public static void main(String[] args) {
11                 // TODO Auto-generated method stub
12                 System.out.println("hello 世界");
13         }
14 

15 } 

默认为GBK编码,程序执行正常


1. 将文件编码改为 utf8 without BOM
1) 不加 encoding选项
  javac -d . Test.java
  java -classpath .;%CLASSPATH% pkg.Test
  
  打印如下:
hello 涓栫晫
  
  很显然已经乱码了。
2) 加上encoding选项
  这时候编译命令改成这个样子:javac -d . -encoding utf8 Test.java
  运行后结果如下:
  hello 世界

2. 将文件编码改为 utf8(带BOM)
编译,结果如下:
Test.java:1: illegal character: \65279
锘縫ackage pkg;
^
1 error

3. 将文件编码改为 UTF16LE (带BOM)
编译:javac -d . -encoding utf-16le Test.java
编译失败,如下:
Test.java:1: illegal character: \65279

4. 将文件编码改为 UTF16LE (不带BOM)
编译:javac -d . -encoding utf-16le Test.java
编译通过
运行结果如下:
hello 世界

5. 将文件编码改为 UTF16BE (带BOM)
编译:javac -d . -encoding utf-16le Test.java
编译失败,如下:
Test.java:1: illegal character: \65279

6. 将文件编码改为 UTF16BE (不带BOM)
编译:javac -d . -encoding utf-16le Test.java
编译通过
运行结果如下:
hello 世界
posted on 2012-12-06 14:46  sanlo  阅读(867)  评论(0编辑  收藏  举报