c# - 如何将 xml 作为 UTF-8 而不是 UTF-16 返回

标签 c# xml utf-8 xml-serialization

我正在使用序列化 <T> 的例程。它可以工作,但是当下载到浏览器时,我看到一个空白页面。我可以查看页面源代码或在文本编辑器中打开下载,我看到了 xml,但它是 UTF-16,我认为这就是浏览器页面显示空白的原因?

如何修改我的序列化程序例程以返回 UTF-8 而不是 UTF-16?

返回的 XML 源:

<?xml version="1.0" encoding="utf-16"?>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <string>January</string>
  <string>February</string>
  <string>March</string>
  <string>April</string>
  <string>May</string>
  <string>June</string>
  <string>July</string>
  <string>August</string>
  <string>September</string>
  <string>October</string>
  <string>November</string>
  <string>December</string>
  <string />
</ArrayOfString>

调用序列化程序的示例:

DateTimeFormatInfo dateTimeFormatInfo = new DateTimeFormatInfo();
var months = dateTimeFormatInfo.MonthNames.ToList();

string SelectionId = "1234567890";

return new XmlResult<List<string>>(SelectionId)
{
    Data = months
};

序列化器:

public class XmlResult<T> : ActionResult
{
    private string filename = DateTime.Now.ToString("ddmmyyyyhhss");

    public T Data { private get; set; }

    public XmlResult(string selectionId = "")
    {
        if (selectionId != "")
        {
            filename = selectionId;
        }
    }

    public override void ExecuteResult(ControllerContext context)
    {
        HttpContextBase httpContextBase = context.HttpContext;
        httpContextBase.Response.Buffer = true;
        httpContextBase.Response.Clear();

        httpContextBase.Response.AddHeader("content-disposition", "attachment; filename=" + filename + ".xml");
        httpContextBase.Response.ContentType = "text/xml";

        using (StringWriter writer = new StringWriter())
        {
            XmlSerializer xml = new XmlSerializer(typeof(T));
            xml.Serialize(writer, Data);
            httpContextBase.Response.Write(writer);
        }
    }
}

最佳答案

您可以使用将强制使用 UTF8 的 StringWriter。这是一种方法:

public class Utf8StringWriter : StringWriter
{
    // Use UTF8 encoding but write no BOM to the wire
    public override Encoding Encoding
    {
         get { return new UTF8Encoding(false); } // in real code I'll cache this encoding.
    }
}

然后在您的代码中使用 Utf8StringWriter 编写器。

using (StringWriter writer = new Utf8StringWriter())
{
    XmlSerializer xml = new XmlSerializer(typeof(T));
    xml.Serialize(writer, Data);
    httpContextBase.Response.Write(writer);
}

答案的灵感来自 Serializing an object as UTF-8 XML in .NET

关于c# - 如何将 xml 作为 UTF-8 而不是 UTF-16 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25730816/

相关文章:

sql-server - 动态替换 XML DML 中节点的值

html - 加载样式表时出错 : Parsing an XSLT stylesheet failed. ?

java - Java 代码中的 UTF-8 问题

c# - 在 UITableView 的编辑模式下允许多重选择

c# - 如何判断 .Net System.Diagnostics.Process 何时运行成功或失败?

c# - 访问动态创建的控件 (c#)

c# - RallyDev - 使用 Rally.RestAPI.dll 和 Service V2.0 获取故事任务

xjb 绑定(bind)文件的 XML 命名空间问题

php - mb_detect_encoding 曾经是 ASCII

python - 将 python 3.7 默认编码从 cp1252 更改为 cp65001 aka UTF-8