【问题标题】:How to set encoding when stream blob from Azure Storage从 Azure 存储流式传输 blob 时如何设置编码
【发布时间】:2019-07-30 17:14:44
【问题描述】:

我的 blob 存储中有一个 XML 文件。它包含这样的词:Družstevní。 当我使用 Azure 门户下载 XML 时,这个词仍然是正确的。
但是当我尝试使用DownloadToStreamAsync 时,结果是Dru�stevn�

我该如何解决这个问题?

我发现 DownloadTextAsync 正在工作,因为我设置了编码:Encoding.GetEncoding(1252)
但是后来我得到了一个字符串,而我的其余代码都在期待一个流。我应该将字符串作为流再次读取还是存在更优雅的选项?

这是我的代码:

public Task<string> DownloadAsTextAsync(string code, Encoding encoding)
{
    var blockBlob = _container.GetBlockBlobReference(code);
    var blobRequestOptions = new BlobRequestOptions
    {
        MaximumExecutionTime = TimeSpan.FromMinutes(15),
        ServerTimeout = TimeSpan.FromHours(1)
    };

    return blockBlob.DownloadTextAsync(Encoding.GetEncoding(1252), null, blobRequestOptions, null);
}

public async Task<Stream> DownloadAsStreamAsync(string code)
{
    var blockBlob = _container.GetBlockBlobReference(code);
    var blobRequestOptions = new BlobRequestOptions
        {
            MaximumExecutionTime = TimeSpan.FromMinutes(15),
            ServerTimeout = TimeSpan.FromHours(1)
        };
    var output = new MemoryStream();
    await blockBlob.DownloadToStreamAsync(output, null, blobRequestOptions, null);
    return output;
}

编辑,路肇兴评论后:
我更改了单元测试并将编码添加到 StreamReader,现在单元测试通过了:

using (var streamReader = new StreamReader(stream, Encoding.GetEncoding(1252)))
{
    string line;
    while ((line = streamReader.ReadLine()) != null)
    {
        if (!line.StartsWith("            <Str>Dru")) continue;

        Debug.WriteLine(line);
        var street = line.Trim().Replace("<Str>", "").Replace("</Str>", "");
        Assert.AreEqual("Družstevní", street);
    }
}

但在我的“真实”代码中,我发送流以加载为XML

fileStream.Position = 0;
var xmlDocument = XDocument.Load(fileStream);

生成的xmlDocument 编码错误。我找不到如何设置编码。

【问题讨论】:

  • 您能分享一下您如何使用从DownloadAsStreamAsync 返回的Stream 的代码吗?我认为这是你需要改变的地方。 Stream 只是一个二进制流,在消费流时由读者决定编码。
  • 感谢@ZhaoxingLu-Microsoft 我已经更新了我的帖子,你说得对,流是好的。问题似乎是在将流作为XDocument 读取时
  • 很高兴听到这个流很好。关于 XDocument 问题,我建议您创建一个新问题,因为上面的问题是关于 Azure Blob 存储主题的。

标签: c# azure azure-blob-storage


【解决方案1】:

问题似乎是在将流作为 XDocument 读取时

您可以使用以下代码将编码设置为Encoding.GetEncoding("Windows-1252"),以将流读取为XDocument。

XDocument xmlDoc = null;

using (StreamReader oReader = new StreamReader(stream, Encoding.GetEncoding("Windows-1252")))
{
    xmlDoc = XDocument.Load(oReader);
}

结果:

【讨论】:

    猜你喜欢
    • 2019-01-27
    • 2013-11-08
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 2019-12-04
    • 2020-01-03
    相关资源
    最近更新 更多