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

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

我试过这个:

var sb = new StringBuilder(); sb.Append('\xEF'); sb.Append('\xBB'); sb.Append('\xBF'); 

但是当我用hex编辑器查看它时,它添加了以下序列: C3 AF C2 BB C2 BF

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

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

两种选择:

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

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

我个人通常会采用第一种方法,但“我不能修改那种方法”表明它可能不是你的选择。

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

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

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

 using(var writer = new StreamWriter(stream)) { writer.Write(sb.ToString()); } 

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

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

更新:

如果您希望从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()); 

IIRC(我不确定),当您使用相关的Unicode编码器之一转换为字节时,会添加BOM。 我相信其中一些构造函数采用了控制是否添加BOM的bool。