Возиться с кодировкой и XslCompiledTransform - PullRequest
4 голосов
/ 18 мая 2010

я возился с кодировками.

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

Я открываю 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;

Затем, в конце концов, я отображаю в веб-браузере содержимое этого автора и получаю следующую ошибку:

Страница XML не может быть отображена Невозможно просмотреть ввод XML, используя стиль простынь. Пожалуйста, исправьте ошибку и затем нажмите кнопку Обновить или попробуйте еще раз позже.

Переключиться с текущей кодировки на указанная кодировка не поддерживается. Ошибка обработки ресурса «http://localhost:2541/Results....

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

Мне интересно, где найти кодировку UTF-16 с учетом того, что:

  • Все мои файлы сохраняются как UTF-8
  • Ответ от сервера в UTF-8
  • Способ чтения листа xslt настроен как UTF-8.

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

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

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

Хосе.

Ответы [ 2 ]

9 голосов
/ 18 мая 2010

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

Редактировать: Другой способ обойти эту проблему - унаследовать от StringWriter и переопределить свойство Encoding, чтобы вернуть нужную кодировку (например, UTF8 в вашем случае). Эта идея взята из сообщения в блоге , написанного Робертом МакЛоусом .

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 (внизу) или следующее сообщение в блоге .

3 голосов
/ 18 мая 2010

Попробуйте использовать:

StringBuilder stringBuilder = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(stringBuilder, transformer.OutputSettings))
{
    xsl.Transform(xmlreader, writer);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...