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

Léa*_*iot 15 byte-order-mark javac utf-8

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

我的问题如下:我想用"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
Run Code Online (Sandbox Code Playgroud)

2)在该文件中创建一个Java类并保存文件,如1)

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

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

dos> xxd Test.java | head -1
0000000: efbb bf70 7562 6c69 6320 636c 6173 7320  ...public class
Run Code Online (Sandbox Code Playgroud)

注意: 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

LEA

el *_*ego 23

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


Eti*_*nat 15

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

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

此错误报告表明此问题永远不会得到解决:http://bugs.java.com/view_bug.do?video_id = 4508058

由于此主题位于"javac BOM"搜索的前2个谷歌搜索结果中,因此我将此处留给未来的读者.

  • 实际上,您提到的错误与 UTF-8 解码器有关;它与是否可以更改*编译器*以检测并丢弃 Java 源文件上的任何 BOM 无关,它可以而且应该这样做。 (2认同)