2010-05-18 47 views
4

即時編碼與混亂。梅辛與編碼和XslCompiledTransform

一方面,我有一個URL以UTF-8響應我(非常確定感謝firebug插件)。

StreamReader reader = new StreamReader(response.GetResponseStream(),System.Text.Encoding.UTF8); 

對於另一方面我有一個變換XSLT片用以下代碼:

林使用以下代碼打開URL讀取UTF-8含量

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
      <br/> 
      hello 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

這XSLT工作表也以UTF-8格式保存。

我用下面的代碼到XML與XSLT混合:

StringWriter writer = new StringWriter(); 
XslCompiledTransform transformer = new XslCompiledTransform(); 

transformer.Load(HttpContext.Current.Server.MapPath("xslt\\xsltsheet.xslt"); 
XmlWriterSettings xmlsettings = new XmlWriterSettings(); 
xmlsettings.Encoding = System.Text.Encoding.UTF8; 
transformer.Transform(xmlreader, null, writer); 

return writer; 

然後畢竟IM在web瀏覽器渲染這個作家的內容和即時得到以下錯誤:

The XML page cannot be displayed Cannot view XML input using style sheet. Please correct the error and then click the Refresh button, or try again later.

Switch from current encoding to specified encoding not supported. Error processing resource ' http://localhost:2541/Results ....

<?xml version="1.0" encoding="utf-16"?> 

林不知道在哪裏找到UTF-16編碼採取計數:

  • 我所有的文件都保存爲UT F-8
  • 來自服務器的響應採用UTF-8
  • 讀取xslt表格的方式配置爲UTF-8。

任何幫助,將不勝感激。

在此先感謝。

最好的問候。

何塞。

回答

9

由於Encoding屬性返回UTF-16編碼,因此您的作者正在將其寫出來。而不是使用StringWriter(即內存中的UTF-16),您可以初始化一個XmlTextWriter實例,以使用UTF-8和MemoryStream作爲後備存儲。

編輯:另一種方法來解決這個問題是從StringWriter繼承和(在你的情況下,例如UTF8)覆蓋Encoding屬性返回你喜歡的編碼。這個想法來自blog post written by Robert McLaws

public class UTF8StringWriter: StringWriter { 
    public UTF8StringWriter() {} 
    public UTF8StringWriter(IFormatProvider formatProvider): base(formatProvider) {} 
    public UTF8StringWriter(StringBuilder sb): base(sb) {} 
    public UTF8StringWriter(StringBuilder sb, IFormatProvider formatProvider): base(sb, formatProvider) {} 

    public override Encoding Encoding { 
     get { 
      return Encoding.UTF8; 
     } 
    } 
} 

你並不孤單這個問題...例如見的MSDN community comment(底部)或以下blog post

3

嘗試使用:

StringBuilder stringBuilder = new StringBuilder(); 
using (XmlWriter writer = XmlWriter.Create(stringBuilder, transformer.OutputSettings)) 
{ 
    xsl.Transform(xmlreader, writer); 
}