【问题标题】:UTF8 Encoding not adding byte order markUTF8 编码不添加字节顺序标记
【发布时间】:2014-12-24 07:47:58
【问题描述】:

我们知道UTF8Encoding 类的构造函数可以接收一个可选参数:bool,指定编码器是否应提供字节顺序标记 (BOM)。

但是,当使用这两种方法编码相同的文本时,输出是相同的:

string text = "Hello, world!";
byte[] withBom= new UTF8Encoding(true).GetBytes(text);
byte[] withoutBom = new UTF8Encoding(false).GetBytes(text);

withBomwithoutBom 的内容相同,一个字节甚至不比另一个多一个字节。

为什么会这样?为什么withBom没有加字节序标记?

【问题讨论】:

    标签: c# .net encoding utf-8 byte-order-mark


    【解决方案1】:

    构造函数中的BOM参数不影响GetBytes的结果,它影响GetPreamble的结果。用户应手动附加它。

    byte[] bom = new UTF8Encoding(true).GetPreamble(); // 3 bytes
    byte[] noBom = new UTF8Encoding(false).GetPreamble(); // 0 bytes
    

    【讨论】:

    • 非常感谢!你知道为什么必须手动附加序言吗?
    • @MatiCicero GetBytes 也可以用于部分输出,而不仅仅是整个字符串。每次都生成 BOM 不会有帮助。
    • 哈哈,很荣幸!
    【解决方案2】:

    BOM 通过UTF8Encoding.GetPreamble 方法返回:

    UTF8Encoding enc = new UTF8Encoding(true);
    byte[] withBom = enc.GetPreamble().Concat(enc.GetBytes(text)).ToArray();
    

    【讨论】:

    • +1 向我展示如何将其附加到我当前的编码字节
    • @MatiCicero 我不建议将此代码用于大字符串。这样会产生太多垃圾。
    猜你喜欢
    • 2014-07-08
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2011-10-30
    相关资源
    最近更新 更多