2009-07-15 72 views
1

我有這樣的代碼來創建一個ATOM供稿爲什麼我的ATOM XML UTF-16而不是UTF-8

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編寫器是添加XML聲明,但作爲settings.Encoding不起作用的部分,我很難過。請幫忙!

感謝

回答

2

其基本原因是,當您使用StringBuilder調用XmlWriter.Create時,它會創建一個新的StringWriter實例,該實例始終具有UTF-16編碼,並在該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之前將它添加在你的代碼寫寫電話。或者,你可以編寫你的函數來接受任意的Stream,並且在你不打算直接寫入Response.OutputStream的時候使用MemoryStream或者FileStream來創建一個XmlWriter。

道歉,如果代碼是不習慣VB;我主要用C#編寫。

+0

乾杯JasonTrue,你的補充完全回答我的問題。我實際上已經忘記了我當時正在做的事情,但是當它再次出現時,我會記得檢查這個答案,並根據您的信息向前推進。 – 2009-11-04 08:36:44

0

嘗試 「settings.Encoding = System.Text.Encoding.UTF8」

我已經嘗試過了,正如MrBrutal注意到,這是行不通的。

我的猜測是,因爲.NET中的字符串始終是UTF-16,所以將XML寫入字符串將始終強制編碼爲utf-16,無論如何。

你應該嘗試寫入一個流,你有更多的控制。 如果目標是寫入文件,那麼應將流連接到該文件並直接在那裏寫入。

如果寫入文件不是最終目標,那麼結果是什麼? 如果你解釋一下用例,可能會有所幫助。 也許最終結果屬於字節數組,而不是字符串。

+0

嗨Mihai,這已經是我嘗試過的方法之一 - 它沒有工作... – 2009-07-15 15:41:19

相關問題