2010-05-18 2 views
4

im messing с кодировками.Мессинг с кодировкой и XslCompiledTransform

С одной стороны у меня есть URL-адрес, который отвечает мне в UTF-8 (им довольно уверен, благодаря плагину firebug).

Im, открывая URL чтения контента в UTF-8, используя следующий код:

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

Для другой стороны у меня есть преобразование XSLT лист со следующим кодом:

<?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; 

Тогда ведь им оказывают в WebBrowser содержание этого писателя и им получить следующую ошибку:

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.

Любая помощь будет оценена по достоинству.

Заранее спасибо.

С наилучшими пожеланиями.

Jose.

ответ

9

Ваш писатель выписывает это, поскольку свойство Encoding возвращает кодировку UTF-16. Вместо использования StringWriter (который является UTF-16 в памяти) вы можете инициализировать экземпляр XmlTextWriter для использования UTF-8 с MemoryStream в качестве резервного хранилища.

Edit: Другой способ обойти эту проблему, чтобы наследовать от StringWriter и переопределить Encoding свойство возвращать кодировку вам нравится (например UTF8 в вашем случае). Эта идея от 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); 
} 
Смежные вопросы