1

我有这个代码来创建一个 ATOM 提要

Dim xmlResult As New StringBuilder
Dim settings As New XmlWriterSettings
Dim atomWriter As XmlWriter = XmlWriter.Create(xmlResult, settings)
Dim atomFormatter As Atom10FeedFormatter = New Atom10FeedFormatter(feed)
atomFormatter.WriteTo(atomWriter)
atomWriter.Close()

它返回如下开头的 XML:

<?xml version="1.0" encoding="utf-16"?><feed xmlns="http://www.w3.org/2005/Atom">

无论我尝试什么,我都无法让它返回 utf-8 而不是 utf-16。当它是 utf-16 时,它无法与 IE8 一起使用,但 utf-8 可以正常工作。我怎么知道它可以正常工作我听到你问我是否不能让它返回 utf-8,我最终使用这行代码将提要返回到浏览器:

Response.Write(Replace(xmlResult.ToString, "utf-16", "utf-8"))

这肯定是你今天见过的最糟糕的黑客,如果不是我为你感到难过!

所以这就是我试图获得 UTF-8 的内容:

Response.ContentEncoding = System.Text.Encoding.UTF8
Response.Charset = "UTF-8"
settings.Encoding = System.Text.Encoding.UTF8

设置行是我认为可行的,但不适合我。我的理解是 XML Writer 是添加 XML 声明的部分,但是由于 settings.Encoding 不起作用,我很难过。请帮忙!

谢谢

4

2 回答 2

2

根本原因是,当您使用 StringBuilder 调用 XmlWriter.Create 时,它​​会创建一个新的 StringWriter 实例,该实例始终具有 UTF-16 编码,并围绕该 StringWriter 创建一个 XmlWriter。在 Reflector 中,StringWriter 的编码看起来像是一个私有的静态变量,所以所有 StringWriter 实例都将具有相同的编码。

是否有某些原因您没有创建直接写入响应输出流的 XmlWriter?

如果你能做到这一点,这段代码对我有用:

With Response
  .ContentEncoding = Encoding.UTF8
  .ContentType = "text/xml"
End With

Dim atomFormatter As Atom10FeedFormatter = New Atom10FeedFormatter(feed)
Dim settings As XmlWriterSettings = New XmlWriterSettings

With settings
  .OmitXmlDeclaration = False
  .Encoding = Encoding.UTF8
End With

Using atomWriter As XmlWriter = XmlWriter.Create(Response.OutputStream, settings)
  atomFormatter.WriteTo(atomWriter)
  atomWriter.Close()
End Using

Response.End()

如果您有充分的理由必须使用 StringBuilder,也许您可​​能会考虑省略 Xml 声明并将其添加到您的代码中 atomFormatter.WriteTo 调用之前。或者,当您不打算直接写入 Response.OutputStream 时,可以使用 MemoryStream 或 FileStream 编写函数以接受任意 Stream 并在其上创建 XmlWriter。

如果代码不是惯用的 VB,请道歉;我主要用 C# 编写。

于 2009-11-04T07:35:58.237 回答
0

尝试“settings.Encoding = System.Text.Encoding.UTF8”

我已经尝试过了,正如 MrBrutal 注意到的那样,它不起作用。

我猜是因为 .NET 中的字符串始终是 UTF-16,所以将 XML 写入字符串总是会强制编码为 utf-16,无论如何。

您应该尝试写入流,您可以在其中拥有更多控制权。如果目标是写入文件,则应将流连接到该文件并直接写入该文件。

如果写入文件不是最终目标,那是什么?如果您稍微解释一下用例,可能会有所帮助。也许最终结果属于字节数组,而不是字符串。

于 2009-07-15T08:59:10.637 回答