【问题标题】:Why isn't the Byte Order Mark emitted from UTF8Encoding.GetBytes?为什么 UTF8Encoding.GetBytes 不发出字节顺序标记?
【发布时间】:2010-09-30 01:40:30
【问题描述】:

sn-p 说明了一切 :-)

UTF8Encoding enc = new UTF8Encoding(true/*include Byte Order Mark*/);
byte[] data = enc.GetBytes("a");
// data has length 1.
// I expected the BOM to be included. What's up?

【问题讨论】:

  • 如下所述,UTF8 不需要 BOM。
  • 说“UTF-8 不需要 BOM”是完全不准确的。序言是应用程序如何区分 UTF8 和编码分页的 ANSI。

标签: c# .net unicode encoding utf-8


【解决方案1】:

您不希望它被用于每个对 GetBytes 的调用,否则您将无法(比如说)一次写入一个文件。

通过使用GetPreamble 公开它,调用者可以在适当的点(即在其数据的开头)插入前导码。我同意文档可能会更清晰。

【讨论】:

  • 一般来说,你应该可以忽略序言,因为你的作家会根据你的编码选择插入它。
【解决方案2】:

谢谢你们。以下工作,LINQ 使组合变得简单:-)

UTF8Encoding enc = new UTF8Encoding(true);
byte[] data = enc.GetBytes("a");
byte[] combo = enc.GetPreamble().Concat(data).ToArray();

【讨论】:

  • 这正是我正在做的。请注意,Encoding.UTF8new UTF8Encoding(true) 的简写,因此您的第一行可能只是 var enc = Encoding.UTF8;,或者将其嵌入到其他两行,或者甚至将整个内容缩小为单行 var combo = Encoding.UTF8.GetPreamble().Concat(Encoding.UTF8.GetBytes("a")).ToArray(); 干杯。
【解决方案3】:

因为预计GetBytes()会被调用很多次...你需要使用:

byte[] preamble = enc.GetPreamble();

(仅在序列开始时调用它)并写下它; this 是 BOM 所在的位置。

【讨论】:

    【解决方案4】:

    请注意,一般情况下,无论如何您都不需要 UTF-8 的字节顺序标记。它的主要目的是区分 UTF16 BE 和 UTF16 LE。没有 UTF8 LE 和 UTF8 BE 这样的东西。

    【讨论】:

    • 它还允许您区分 UTF-8 文件和 ANSI 文件。
    • 甚至微软也承认“ANSI”是一个令人困惑的名字——即使它被用来描述一个字符集。无论如何,“ANSI 文件”都不存在;在 Windows 上,所有文件都是二进制文件(大型机确实有真正的文本文件,但它们没有“Microsoft ANSI”)
    猜你喜欢
    • 1970-01-01
    • 2014-06-09
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多