【问题标题】:Compiling (javac) a UTF8 encoded Java source code with a BOM使用 BOM 编译 (javac) UTF8 编码的 Java 源代码
【发布时间】:2012-04-06 08:54:16
【问题描述】:

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

我的问题如下:我想用“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) 一样保存该文件

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?

感谢您的帮助和最诚挚的问候。

莉亚

【问题讨论】:

  • 没错:您必须删除 BOM。它在 UTF-8 中没有任何业务,所以它当然是一个错误。这是一个长期存在的微软错误。永远不要将 BOM 放入 UTF-8 中!!!!!!
  • 你好。谢谢您的回答。我使用“Notepad++”将文件编码为“UTF8 without BOM”。现在可以使用“javac”编译代码了。
  • @tchrist The Unicode Standard (page 30) 允许使用 UTF-8 格式的 BOM,因此如果您愿意,您有权将其放在那里。为什么你想要是另一个故事,但javac 应该处理它。

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


【解决方案1】:

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

【讨论】:

  • 这解决了我的 javac 编译问题。但是现在 Windows10 控制台仍然显示未知字符,例如“?????????????”。
  • Afaiu, chcp 65001 应该可以帮助您使用控制台。
  • 也试过了,问题没有解决。打开问号“??????”转换成盒装问号。 Windows 控制台仍然无法识别文本。在这里,显示正确:लोकसभालोकसभाकेचुनावीरणमेंसत्तारूढ़भाजपाओरसेसिर्फनरेन्द्रमोदीहीदेरहेरहेरहेरहेरहेरहे。 span>
  • 这是我至少3个月没能解决的问题。感谢stackoverflow!
【解决方案2】:

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

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

这个错误报告表明这个“问题”永远不会被修复:https://web.archive.org/web/20160506002035/http://bugs.java.com/view_bug.do?bug_id=4508058

由于此线程在“javac BOM”搜索的前 2 个 google 结果中,因此我将其留给未来的读者。

【讨论】:

  • 其实你提到的这个bug和UTF-8解码器有关;它与 compiler 是否可以更改以检测和丢弃 Java 源文件上的任何 BOM 无关,它可以而且应该这样做。
【解决方案3】:

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

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

其实

  • BOM 不是区分 ANSI 和 Unicode。不要使用 故意的功能不是为它设计的。

  • UTF-8 被设计为有意向后兼容 ANSI,所以很多 为处理依赖的格式化文本而编写的代码 仅 0..127 字节(XML、JSON 等)应该可以正确处理 UTF-8 编码文本,无需任何修改。

【讨论】:

  • 注意:它只是字节级别的兼容性,但是当使用 UTF-8 代替 ANSI 时,字符级别的计算会出错。
  • UTF-8 仅向后兼容 ASCII(7 位范围,0x0 - 0x7F),不兼容 ANSI(ASCII 扩展,它还定义了 8 位范围内的字符,0x80 - 0xFF,并且该范围与 UTF-8 兼容)。是的,UTF-8 文件中的 BOM 用于将其与 ANSI(或 OEM,...)文件区分开来。
猜你喜欢
  • 2012-11-10
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 2023-04-02
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多