如何将非标准字符转义到Windows 1252字符集

时间:2019-04-09 11:54:44

标签: xml xslt character-encoding

我有一个具有非标准字符的xml文件,我想将其转换为Windows 1252编码,因此&#nnn我不太了解XSLT,但是我已经尝试过任何帮助,请这里是XML和XSLT

<?xml version="1.0"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes" encoding="Windows-1252"/>

  <xsl:template match="/Recordset">
    <Recordset><xsl:apply-templates /></Recordset>
  </xsl:template>

  <xsl:template match="*|@*">
    <xsl:copy>
      <xsl:apply-templates select="@*" />
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>
</xsl:transform>

字符的XML示例

<?xml version="1.0"?>
<Recordset> 
128 € euro sign
129    NOT USED
130 ‚ single low-9 quotation mark
131 ƒ Latin small letter f with hook
132 „ double low-9 quotation mark
133 … horizontal ellipsis
134 † dagger
135 ‡ double dagger
136 ˆ modifier letter circumflex accent
137 ‰ per mille sign
138 Š Latin capital letter S with caron
139 ‹ single left-pointing angle quotation mark
140 Œ Latin capital ligature OE
141    NOT USED
142 Ž Latin capital letter Z with caron
143    NOT USED
144    NOT USED
145 ‘ left single quotation mark
146 ’ right single quotation mark
147 “ left double quotation mark
148 ” right double quotation mark
149 • bullet
150 – en dash
151 — em dash
152 ˜ small tilde
153 ™ trade mark sign
154 š Latin small letter s with caron
155 › single right-pointing angle quotation mark
156 œ Latin small ligature oe
157    NOT USED
158 ž Latin small letter z with caron
159 Ÿ Latin capital letter Y with diaeresis
160 no-break space 
</Recordset>

1 个答案:

答案 0 :(得分:0)

您要询问的字符可以在您要询问的文档字符编码中表示。因此,您不需要使用数字字符实体引用。

XSLT似乎太过改变文档字符编码。您需要读取原始XML文件,然后使用不同的文档字符编码再次将其写出。这将导致无法在您选择的字符编码中表示的Unicode代码点被序列化为数字字符实体引用。无需涉及XSLT,对于XSLT,您将必须完成所有这些工作。因此,您可以跳过XSLT步骤。

尽管如此,如果您确实有一个工具可以读取XML文件,应用转换并再次将其写入,并遵守xsl:output编码属性,则可以将 Identity Transform 与适当的输出元素:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="XML" encoding="Windows-1252" />
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

如果在示例文档中执行此操作,则会看到“ 128€欧元符号”确实在Windows-1252中进行了编码。

31 32 38 20 80 20 65 75 72 6F 20 73 69 67 

如果要将€表示为数字字符实体引用,请使用文档字符编码对不支持该字符集的字符集进行编码,例如IBM437。

目前还不清楚为什么要使用UTF-8以外的文档字符编码。如果XML处理器不支持XML的字符集(即Unicode),它就不会走得太远。