【发布时间】: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