2013-06-20 2 views
0

Я работаю над программой просмотра файлов xml в формате html с помощью xslt. Все идет прекрасным исключением из моей локализации. В результате HTML-файл имеет «Ã³», где должны быть некоторые двухбайтовые символы. Я не могу понять, что я делаю неправильно.XSLT, не кодирующий двухбайтовые символы

Вот аа урезанная XSLT-файл:

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

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:fn="http://www.w3.org/2005/02/xpath-functions"> 

    <xsl:output method="html" version="4.0" encoding="utf-8" indent="yes"/> 

    <xsl:variable name="language" select="nbklog/@language" /> 
    <xsl:variable name="dictionaryName"> 
    dictionary_<xsl:value-of select="$language"/>.xml 
    </xsl:variable> 
    <xsl:variable name="dictionary" select="document($dictionaryName)" /> 

    <xsl:template match="/nbklog"> 
    <html> 
     <body>   
     <h2>  
      <xsl:value-of select="$dictionary//String[@Key=$jobType]" /> 
     </h2> 
     </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

Вот файл словаря XML используется для локализации:

<?xml version="1.0" encoding="utf-8"?> 
    <Dictionary xml:lang="es-ES"> 
    <String Key="Application"> 
     Applicación 
    </String> 
    </Dictionary> 

Вот пример файла XML трансформироваться:

<?xml version="1.0" encoding="utf-8"?> 
<nbklog id="51b654d4" jobType="backup" language="es-ES" version="1.0"> 
    <deviceName>c:\</deviceName> 
    .... 
</nbklog> 

Я выполняю преобразование следующим кодом C#:

string theOutputHtml; 

using (MemoryStream ms = new MemoryStream()) { 
    using (XmlTextWriter writer = new XmlTextWriter(ms, Encoding.UTF8)) { 

     XPathDocument theDocument = new XPathDocument(inXmlFilename); 

     // Load the style sheet and run the transformation. 
     XslCompiledTransform theXslTrasform = new XslCompiledTransform(); 
     theXslTrasform.Load(inXsltFilename, XsltSettings.TrustedXslt, null); 
     theXslTrasform.Transform(theDocument, writer); 

     ms.Position = 0; 

     using (StreamReader theReader = new StreamReader(ms)) { 
      theOutputHtml = theReader.ReadToEnd(); 
     } 
    } 
} 

Содержимое theOutputHtml будет иметь «Ã³» вместо «ó».

EDIT:

Добавление этого между тегами и в HTML строку решить мою проблему:

<meta http-equiv='Content-Type' content='text/html;charset=UTF-8'> 
+2

Другими словами, ответы, которые сказали кодирование было неправильно были правильными, но они определили неправильную кодировку. Проблема заключалась в том, что вы выполняли вывод UTF-8 без настройки вашего HTML-сервера, чтобы обозначить его как таковой, поэтому браузер пытался прочитать данные UTF-8 как ISO 8859-1. –

+0

Это было двухместное мощение с моей стороны. Сначала было предложено ответы (фиксированные секунды после того, как я разместил вопрос), во-вторых, это объяснялось моим редактированием и вашим комментарием. –

ответ

1

Изменить new XmlTextWriter(ms, Encoding.ASCII) к new XmlTextWriter(ms, Encoding.UTF8)

Update:

другой Возможная проблема хотя ваши XML-файлы имеют объявление encoding="utf-8", возможно, файлы фактически не сохранены с этой кодировкой. Убедитесь, что все кодировки ваших XML-файлов соответствуют объявленным кодировкам. Лично я предпочитаю отказаться от объявления кодировки, чтобы он мог быть автоматически обнаружен.

+0

Спасибо за быстрый ответ. Как только я представил вопрос, я нашел это. Я редактировал сообщение. Когда изменилось на Encoding.UTF8, теперь я получаю '³' вместо '?' но это все еще не правильный вывод. –

1

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

using (XmlTextWriter writer = new XmlTextWriter(ms, Encoding.Unicode)) 
+0

Спасибо за ответ, пожалуйста, см. Мой комментарий к ответу Якова. –

+0

Вы всегда можете использовать шестнадцатеричный код: ó – EkoostikMartin