2014-11-14 26 views
2

我試圖在序列化對象時將編碼類型設置爲ISO-8859-1。代碼運行時不會引發任何異常,但返回的編碼類型始終設置爲「UTF-16」。我搜索了很多例子,有100個樣本,但我根本無法強制所需的編碼類型。C#XmlSerializer強制編碼類型爲ISO-8859-1

我的問題是,我如何強制它將編碼設置爲ISO-8859-1?

在此先感謝。

的代碼是:

XmlWriterSettings xmlWriterSettings = new XmlWriterSettings 
{ 
    Indent = true, 
    OmitXmlDeclaration = false, 
    Encoding = Encoding.GetEncoding("ISO-8859-1") 
}; 

using (var stringWriter = new StringWriter()) 
{ 
    using (var xmlWriter = XmlWriter.Create(stringWriter, xmlWriterSettings)) 
    { 
     serializer.Serialize(xmlWriter, obj, ns); 
    } 

    return stringWriter.ToString(); 
} 

回答

7

當寫入XML到TextWriter(例如StringWriterStreamWriter),它總是使用由TextWriter指定的編碼,並忽略在XmlWriterSettings中指定的一個。對於StringWriter,編碼始終是UTF-16,因爲這是.NET字符串在內存中使用的編碼。

的解決辦法是寫一個MemoryStream和讀取從那裏串:

var encoding = Encoding.GetEncoding("ISO-8859-1"); 
XmlWriterSettings xmlWriterSettings = new XmlWriterSettings 
{ 
    Indent = true, 
    OmitXmlDeclaration = false, 
    Encoding = encoding 
}; 

using (var stream = new MemoryStream()) 
{ 
    using (var xmlWriter = XmlWriter.Create(stream, xmlWriterSettings)) 
    { 
     serializer.Serialize(xmlWriter, obj, ns); 
    } 
    return encoding.GetString(stream.ToArray()); 
} 

請注意,如果你在一個字符串的XML,當你把它寫入一個文件,你需要確保用相同的編碼編寫它。

+1

@CiaranGallagher請不要編輯一個答案,只是爲了使其適合您的個人風格偏好 – 2016-06-05 16:55:28

+0

這不是一種風格偏好,正如我在編輯註釋中提到的,原始代碼導致了Visual Studio代碼分析警告。 – 2016-06-05 21:43:18