Csharp/C#教程:通过StringBuilder将字节顺序标记添加到字符串分享


通过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。

上述就是C#学习教程:通过StringBuilder将字节顺序标记添加到字符串分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1009968.html

(0)
上一篇 2021年12月29日
下一篇 2021年12月29日

精彩推荐