代码之家  ›  专栏  ›  技术社区  ›  Exception e

阻止file.writeAllText写入双字节顺序标记(bom)?

  •  0
  • Exception e  · 技术社区  · 6 年前

    在下面的示例中,如果(字符串)文本以bom开头,file.writeAllText()将添加 另一个 ,写作 两个bom .

    我想写两遍课文:

    1. 完全没有bom
    2. 使用单个物料清单(如果适用于编码)

    实现这一点的规范方法是什么?

    HttpWebResponse response = ...
    Byte[] byte = ... // bytes from response possibly including BOM 
    
    var encoding = Encoding.GetEncoding(
                        response.get_CharacterSet(),
                        new EncoderExceptionFallback(),
                        new DecoderExceptionFallback()
                   );
    string text = encoding.GetString(bytes); // will preserve BOM if any
    System.IO.File.WriteAllText(fileName, text, encoding);
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   xanatos    6 年前

    你正在解码然后重新编码文件…这是很没用的。

    Encoding 班上有一个 GetPreamble() 方法,在 byte[] . 然后我们可以检查 bytes 接收的数组是否已经有这个前缀。然后根据这些信息,我们可以编写文件的两个版本,必要时添加或删除前缀。

    var encoding = Encoding.GetEncoding(response.CharacterSet, new EncoderExceptionFallback(), new DecoderExceptionFallback());
    
    // This will throw if the file is wrongly encoded
    encoding.GetCharCount(bytes);
    
    byte[] preamble = encoding.GetPreamble();
    
    bool hasPreamble = bytes.Take(preamble.Length).SequenceEqual(preamble);
    
    if (hasPreamble)
    {
        File.WriteAllBytes("WithPreambleFile.txt", bytes);
    
        using (var fs = File.OpenWrite("WithoutPreamble.txt"))
        {
            fs.Write(bytes, preamble.Length, bytes.Length - preamble.Length);
        }
    }
    else
    {
        File.WriteAllBytes("WithoutPreambleFile.txt", bytes);
    
        using (var fs = File.OpenWrite("WithPreamble.txt"))
        {
            fs.Write(preamble, 0, preamble.Length);
            fs.Write(bytes, 0, bytes.Length);
        }
    }