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

Utf 8 使用BOM编译(javac)UTF8编码的Java源代码,utf-8,javac,byte-order-mark,Utf 8,Javac,Byte Order Mark,您好,谢谢您阅读我的帖子 我的问题如下:我想编译一个带有“javac”的Java源文件,这个文件是用BOM进行UTF-8编码的(操作系统是WinXP) 以下是我的工作: 1) 使用“记事本”创建一个文件,并选择UTF-8编码 dos> notepad Test.java "File -> Save as..." File name : Test.java Save as type: All Files Encoding : UTF-8 Save 2) 在该文件中创建一个J

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

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

以下是我的工作:

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所示

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

注: ef bb bf是UTF-8编码的BOM(UTF-16编码的BOM是FE FF

4) 尝试用“javac”编译此代码

注:65279是BOM的十进制版本

我的问题如下:我如何使此编译工作与:

  • 保持UTF-8编码
  • 保存BOM表呢
谢谢你的帮助和问候


Léa

修剪BOM表,然后使用
javac-编码utf8 x.java
这不是文本编辑器的问题,而是javac的问题! Unicode规范说BOM在UTF-8中是可选的,但并没有说它是禁止的! 如果BOM可以存在,那么javac必须处理它,但它没有。实际上,在UTF-8文件中使用BOM有助于区分ANSI编码文件和Unicode编码文件

建议的删除BOM表的解决方案只是一种变通方法,不是正确的解决方案

此错误报告表明此“问题”将永远无法修复:

由于该线程位于“javacbom”搜索的前2名谷歌搜索结果中,我将把它留给未来的读者

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

实际上

  • BOM并不是要区分ANSI和Unicode。不要使用 它不是为特定目的而设计的功能

  • UTF-8的设计目的是有意与ANSI向后兼容,因此 为处理所依赖的格式化文本而编写的代码 仅0..127字节(XML、JSON等)应能正确使用UTF-8编码文本,无需任何修改


没错:您必须删除BOM表。它在UTF-8中没有业务,所以它当然是一个错误。这是一个长期存在的微软错误。永远不要在UTF-8中添加BOM!!!!!你好谢谢你的回答。我使用“Notepad++”将文件编码为“UTF8无BOM”。使用“javac”编译代码现在可以了。@tchrist允许使用UTF-8格式的BOM,因此如果您愿意,您完全有权将其放在那里。你为什么要这么做是另一回事,但是
javac
应该会处理它。实际上,你提到的bug可能与UTF-8解码器有关;这与编译器是否可以被修改以检测和丢弃Java源文件上的任何BOM无关,它可以而且应该这样做。这解决了我的javac编译问题。但现在Windows10控制台仍显示未知字符,如“???????”。Afaiu,
chcp 65001
应该可以帮助您使用控制台。也尝试了此操作,但问题未得到解决。开放式问号“??”转换为带方框的问号。Windows控制台仍然无法识别文本。这里显示的是正确的,如:लोकसभा के चुनावी रण में सत्तारूढ़ भाजपा की ओर से सिर्फ नरेन्द्र मोदी ही दिखाई दे रहे हैं।注意:这只是字节级的兼容性,但当UTF-8代替ANSI时,字符级的计算变得错误。
public class Test
{
    public static void main(String [] args)
    {
        System.out.println("This is a test.");
    }
}
dos> xxd Test.java | head -1
0000000: efbb bf70 7562 6c69 6320 636c 6173 7320  ...public class
dos> javac -encoding utf8 Test.java
Test.java:1: illegal character: \65279
?public class Test
^
1 error