XSLT未编码双字节字符

本文关键字:字节 字符 编码 XSLT | 更新日期: 2023-09-27 18:19:29

我正在开发一个查看器,使用xslt将xml日志文件显示为html。一切都很顺利,除了我的本地化。生成的HTML文件有一个"â³",其中应该有一些双字节字符。我不知道我做错了什么。

下面是一个精简的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();
         }
     }
 }

OutputHtml的内容将有一个"â³"而不是"ó"。

编辑:

在html字符串的和标签之间添加这个解决了我的问题:

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

XSLT未编码双字节字符

new XmlTextWriter(ms, Encoding.ASCII)更改为new XmlTextWriter(ms, Encoding.UTF8)

更新:

另一个可能的问题是,尽管您的XML文件有encoding="utf-8"声明,但可能这些文件实际上并没有使用该编码保存。检查所有XML文件的编码是否与其声明的编码匹配。就我个人而言,我更喜欢取消声明编码,这样它就可以被自动检测到。

很确定,因为您使用了错误的编码,请尝试以下操作:

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