通过StringBuilder将字节顺序标记添加到字符串

Ada*_*abo 4 c# stringbuilder byte-order-mark utf-8

如何在StringBuilder中添加字节顺序标记?(我必须将一个字符串传递给另一个将其保存为文件的方法,但我无法修改该方法).

我试过这个:

var sb = new StringBuilder();
sb.Append('\xEF');
sb.Append('\xBB');
sb.Append('\xBF');
Run Code Online (Sandbox Code Playgroud)

但是当我用十六进制编辑器查看它时,它会添加以下序列: C3 AF C2 BB C2 BF

字符串很大,所以不用来回转换为字节数组就可以了.

编辑: 在评论中提问后澄清.我必须将字符串传递给另一个接受字符串的方法,并在Azure Blob存储上创建它的文件.我无法修改其他方法.

Jon*_*eet 11

两种选择:

  1. 不要在文本中包含字节顺序标记...而是使用将自动包含它的编码
  2. 将其作为角色包含在您的StringBuilder:

    sb.Append('\uFEFF'); // U+FEFF is the byte-order mark character
    
    Run Code Online (Sandbox Code Playgroud)

我个人通常会采用第一种方法,但"我无法修改该方法"表明它可能不是您的选择.


Pet*_*hie 7

字节顺序标记用于通知读者文件具有特定编码的文件.因此,您只需要在实际文件中使用字节顺序标记(BOM).如果要在正在编写的文本文件中包含BOM,只需使用StreamWriter写入文件即可.例如:

using(var writer = new StreamWriter(stream, System.Text.Encoding.UTF8))
{
    writer.Write(sb.ToString);
}
Run Code Online (Sandbox Code Playgroud)

如果您不想要带有UTF-8的BOM:

using(var writer = new StreamWriter(stream))
{
    writer.Write(sb.ToString());
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您需要不同的BOM:

using(var writer = new StreamWriter(stream, System.Text.Encoding.UTF16))
{
    writer.Write(sb.ToString);
}
Run Code Online (Sandbox Code Playgroud)

更新:

如果您希望从BOM的实现细节或特定编码的BOM(即可能在运行时或部署后更改)中进行耦合,但仍希望传递BOM标记的字符串,则可以执行此类操作(假设. NET 4.5):

var stream = new MemoryStream();
var encoding = Encoding.UTF8; // TODO: configurize this, if necessary
using(var writer = new StreamWriter(stream, encoding, 1024, true))
{
    writer.Write(sb.ToString());
}
CantModifyButMustUseThis(encoding.GetString(stream.ToArray());
Run Code Online (Sandbox Code Playgroud)