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-16 ではなく utf-8 を返すことができません。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 を呼び出すと、常に UTF-16 のエンコーディングを持つ新しい StringWriter インスタンスが作成され、その StringWriter の周りに XmlWriter が作成されるためです。Reflector を見ると、StringWriter のエンコーディングはプライベートな静的変数であるように見えるため、すべての StringWriter インスタンスは同じエンコーディングを持ちます。

Response OutputStream に直接書き込む 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 に答える