2012-03-21 107 views
14

您好,感谢您阅读我的文章。用BOM编译(javac)UTF8编码的Java源代码

我的问题如下:我想编译一个带有“javac”的Java源文件,该文件是用BOM(操作系统为WinXP)编码的UTF-8。

下面是我做的:

1)创建一个文件用“记事本”,然后选择UTF-8编码

dos> notepad Test.java 
"File -> Save as..." 
File name : Test.java 
Save as type: All Files 
Encoding : UTF-8 
Save 

2)创建该文件中的Java类,并保存文件像1)

public class Test 
{ 
    public static void main(String [] args) 
    { 
     System.out.println("This is a test."); 
    } 
} 

3)可视化的文件的十六进制版本(第一行)

dos> xxd Test.java | head -1 
0000000: efbb bf70 7562 6c69 6320 636c 6173 7320 ...public class 

注: EF BB BF是UTF-8编码的BOM(的UTF-16编码BOM是FE FF)。

4)尝试编译这段代码 “的javac”

dos> javac -encoding utf8 Test.java 
Test.java:1: illegal character: \65279 
?public class Test 
^ 
1 error 

注:是BOM的十进制版本。

我的问题是:我怎样才能使这个编译工作:

  • 保持它的UTF-8编码
  • 并保持BOM?

谢谢你的帮助和问候。

LEA

+4

是的:您必须删除BOM。它在UTF-8上没有任何业务,所以当然这是一个错误。这是一个长期存在的微软错误。永远不要把BOM放在UTF-8中!!!!! – tchrist 2012-03-21 20:56:42

+0

你好。谢谢您的回答。 我使用“Notepad ++”将文件编码为“无BOM的UTF8”。 现在可以使用“javac”编译代码。 – 2012-03-22 09:20:09

+3

@tchrist [Unicode标准(第30页)](http://www.unicode.org/versions/Unicode6.0.0/ch02.pdf)支持UTF-8中的BOM,因此您完全有权将它放在那里如果你愿意的话。为什么你想要另一个故事,但'javac'应该处理它。 – ArtB 2013-07-09 18:46:09

回答

20

修剪BOM,然后用javac -encoding utf8 x.java

14

这是不是与你的文本编辑器有问题,这是一个问题的javac! Unicode规范说BOM是UTF-8中的唯一选项,但并未说它是禁止的! 如果物料清单可以在那里,那么javac必须处理它,但它不。实际上,在UTF-8文件中使用BOM对于区分ANSI编码文件和Unicode编码文件非常有用。

建议的删除BOM解决方案只是一种解决方法,而不是适当的解决方案。

这个bug报告指出,这个“问题”将永远不会被固定:http://bugs.java.com/view_bug.do?bug_id=4508058

由于该线程处于顶部2谷歌搜索结果的“javac的BOM”搜索,我在这里留下这个对于未来的读者。