繁体   English   中英

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

[英]Add byte order mark to a string via StringBuilder

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

我试过这个:

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

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

字符串很大,所以最好不要来回转换为字节数组。

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

两种选择:

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

     sb.Append('\'); // 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。 我相信其中一些构造函数采用 bool 来控制是否添加 BOM。

我在 ASP.NET 核心中使用了这段代码,很好!! 有用

 [HttpGet("GetCsv")]
    public async Task<IActionResult> GetCsv() {
        
        var cc = new CsvConfiguration(new System.Globalization.CultureInfo("en-US"));
        var entity = await _service.AdminPanelList();
        using (var ms = new MemoryStream()) {
            using (var sw = new StreamWriter(stream: ms, encoding: new UTF8Encoding(true))) {
                using (var cw = new CsvWriter(sw, cc)) {

                    var bom = '\uFEFF'.ToString();
                    byte[] bomArray = Encoding.UTF8.GetBytes(bom);
                    
                    ms.Write(bomArray);
                    cw.WriteRecords(entity);
                }

                var finalArray = ms.ToArray();
                



                var result = File(finalArray, "text/csv", $"PersonExport.csv");
                    

                return result;
            }
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM