使用BOM编译(javac)UTF8编码的Java源代码

时间:2012-03-21 19:17:14

标签: utf-8 javac byte-order-mark

您好,感谢您阅读我的帖子。

我的问题如下:我想用“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

注意: 65279 是BOM的十进制版本。

我的问题如下:如何使用以下内容进行编译:

  • 保持UTF-8编码
  • 并保留BOM?

感谢您的帮助和最好的问候。

LEA

3 个答案:

答案 0 :(得分:22)

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

答案 1 :(得分:15)

这对你的文本编辑器来说不是问题,这是javac的一个问题! Unicode规范称BOM是UTF-8中的选项,它并不是说它是被禁止的! 如果BOM可以存在,那么javac可以处理它,但事实并非如此。实际上,使用UTF-8文件中的BOM可以区分ANSI编码文件和Unicode编码文件。

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

此错误报告表明此“问题”永远无法修复:http://bugs.java.com/view_bug.do?bug_id=4508058

由于此主题位于“javac BOM”搜索的前2位Google搜索结果中,因此我将此处留给未来的读者。

答案 2 :(得分:0)

  

https://stackoverflow.com/a/28043356/7050261

     

实际上,在UTF-8文件中使用BOM有助于区分ANSI编码的文件和Unicode编码的文件。

实际上

  • BOM与区分ANSI和Unicode无关。不要使用 该功能不是故意设计的。

  • UTF-8旨在与ANSI向后兼容,因此很多 编写用于处理格式文本的代码 仅0..127字节(XML,JSON等)可以正确使用UTF-8编码的文本,而无需进行任何修改。