【问题标题】:How can I make Notepad to save text in UTF-8 without the BOM?如何让记事本在没有 BOM 的情况下以 UTF-8 保存文本?
【发布时间】:2012-01-15 23:36:26
【问题描述】:

我有一个带有特殊重音符号的CSV 文件,并通过选择 UTF-8 编码将其保存在记事本中。当我使用 Java 读取文件时,它也会读取 BOM 字符。

所以我想将此文件保存为 UTF-8 格式,而不是最初在记事本中附加 BOM。

否则,Java 中是否有一个内置类可以在读取文件内容时消除开头出现的 BOM 字符?

【问题讨论】:

  • 或许……不要用记事本处理UTF8文本?试试其他众多的文本编辑器,比如 Notepad++ 或 jEdit。
  • 在记事本中制作上述功能,因为它只是微软自带的:)

标签: java csv utf-8 notepad


【解决方案1】:
  1. 使用Notepad++ - 它是免费的,而且比记事本好得多。这将有助于使用 编码在没有 BOM 的情况下以 UTF-8 编码 来保存没有 BOM 的文本:

    Notepad++ v6 和更早版本:

    Notepad++ v7+:

  2. 当我在 Java 中遇到这个问题时,我没有找到任何库来解析这前三个字节(BOM)。所以我的建议:

    • 使用PushbackInputStream(in, 3)
    • 读取前三个字节
    • 如果不是 BOM (EF BB BF),将它们推回
    • 将流处理为 UTF-8

【讨论】:

  • 我现在正在研究这个。如果我找到了比剥离字节更好的方法,我会在这里发布。盲目剥离字节的问题是“我不能说文件只使用 utf-8 保存。它也可以用 ANSI 编码。'
  • 你不需要盲目的脱衣。如果您分析前两个字节并且它是 BOM,那么您有 99% 的可能性文件是 UTF-8。只有在这种情况下,你才应该切断它们。无论如何,当你找到它时,请在这里写下你的解决方案。
  • 为我工作!一旦我将它保存在 Notepad++ 中,utf-8 错误就消失了。
  • Erm...有人注意到 UTF-8 BOM 的长度是 3 个字节而不是 2 个字节吗? ;) 它是 0xEF 0xBB 0xBF 所以你需要去掉文件的前 3 个字节!!!
  • @user1058036 file 命令可以检测没有bom的utf8。可能有在 utf8 中有效但不是有效 ascii 的代码,例如 df90 fileformat.info/info/unicode/char/05d0/index.htm df 不是有效的 ascii,因为 ascii(除了扩展 ascii),ascii 是 0-127,所以 0-7f 不包括 df。
【解决方案2】:

改用记事本++。请参阅我的personal blog post。在 Notepad++ 中,选择“编码”菜单,然后选择“在没有 BOM 的情况下以 UTF-8 编码”。

【讨论】:

  • 我知道记事本 2 和记事本++。我想在记事本中这样做
  • 标准 Windows 记事本不是真正的编辑器,不支持 BOM 功能周围的任何选项。如果您不想使用其他编辑器,则需要按照此处其他答案之一的建议正确处理 Java 代码中的 BOM。
【解决方案3】:

我刚刚从this Stack Overflow post 那里了解到,正如@martin-geisler 指出的那样,您可以通过选择ANSI在Windows 记事本中保存没有BOM 的文件> 作为编码。

我假设对于更高级的用途,这将不起作用,因为生成的文件可能不是希望的结束编码,而是实际上是 ANSI;但我测试并确认这可以仅使用记事本保存一个非常小的 .php 脚本而无需 BOM。

我了解到 Windows 的记事本 不是真正的编辑器这一点漫长而艰难,尽管我想向其他人指出,尽管如此,它具有误导性 strong> 当您在较新的 Windows 机器上(至少在我的一台机器上)键入“editor”时会调用它。

我目前正在使用Emacs和其他编辑器来解决这个问题。

【讨论】:

  • 在记事本 ++ 中选择 ANSI 对我有用,但将其编码为 w/o BOM 没有
  • 我发现如果用word编辑文本文件中的特殊字符可以改变编码,例如我们有一个带有注释的.xml文件,其中有人从电子邮件/ms中复制和粘贴- word 导致 UTF-8 文件更改为 UTF-8-BOM。我删除了特殊字符,并且能够验证记事本在删除这些特殊字符时将文件保存为没有 BOM 的 UTF-8。
  • 请注意,对于任何只包含基本 128 个 ASCII 字符 (0x00-0x7F) 的文件,UTF-8 与“ANSI”完全相同。
【解决方案4】:

Windows 10 版本 1903(2019 年 5 月更新)及更高版本上的记事本支持在没有 BOM 的情况下保存为 UTF-8。事实上,UTF-8 现在是默认的文件格式了。

参考:Windows 10 Notepad is Getting Better UTF-8 Encoding Support

【讨论】:

    【解决方案5】:

    答案是:一点也不。记事本做不到。

    在 Java 中,您可以跳过 InputStream 中的第一个字节并完成。

    【讨论】:

    • 记事本在文件开头添加了一些不可见的字节来标识当前文件编码的字节顺序。
    • 然后跳过适当的字节。如果记事本添加了它们并且您想坚持使用记事本而不是跳过它们并且一切都很好。
    • 将检查除删除字节之外的任何其他解决方案。如果没有什么可行的,那么我必须删除字节。我不能说文件只用 utf-8 保存。它也可以用 ANSI 编码。
    • @user1058036 那么你希望 bom 在那里,这样你就可以区分 UTF-8 和 ANSI
    • @user1058036 记事本向 Unicode 文件添加 BOM 并没有太多,因为 Windows 通常经常倾向于使用各种 Unicode BOM 作为通用 Unicode 签名,有效地将它们转换为在适用时作为检测 Unicode 编码的首选方式的幻数。这是可能,因为检查 2-4 个特定字节比使用启发式方法检测 Unicode 更有效,但很烦人,因为它会破坏任何不理解 BOM 的内容;应提供选项以在没有 BOM 的情况下保存。
    【解决方案6】:

    您可能想试试Notepad2Notepad++。这些记事本替代品可以让您选择是否输出 BOM。

    至于Java解决方案,据我所知,Java不理解标准的UTF-8。我搜索了一下,发现 Java's UTF-8 and Unicode writing is broken - Use this fix 可能是解决方案。

    【讨论】:

      【解决方案7】:

      我们正在使用实用程序 BOMStripperInputStream.java 从我们的输入中删除 BOM(如果存在)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-15
        • 1970-01-01
        • 2014-03-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多