【问题标题】:XML -> XSLT using encoding UTF-8 doesn't work with Microsoft Excel - why?XML -> 使用编码 UTF-8 的 XSLT 不适用于 Microsoft Excel - 为什么?
【发布时间】:2019-06-07 03:18:11
【问题描述】:

我在使用 Microsoft Excel 和我生成的“文本文件 - csv”/“文本文件 - 选项卡”时遇到问题。

所有应用程序都看到 UTF-8 编码并与德语变音符号 (äöüßÄÖÜ) 一起使用。
Notepad++ (Windows 7) 打开文件并显示所有正确
编辑器 (Windows 7) 打开文件并显示所有正确
只有..... Excel 以错误的编码打开文件(如果您在没有导入选项对话框的情况下使用它)并破坏所有德语变音符号。

我在 excel 首选项中没有找到避免此问题的选项 - 也许我是盲人,或者微软在 excel 方面做得不好。

XSLT 中是否有办法更改任何内容,excel 将正确完成工作(没有导入选项对话框 - 我知道,如果您在此对话框中为它们提供编码,这可行)

在示例“München”中是正确的,但 excel 给了我错误的结果。我无法发布 Excel 结果 - 在输入字段中出现错误。

我只在 XSLT 1.0 中工作

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <table name="test">
        <row>
            <field attr3="name">München</field>
        </row>
    </table>
</root>

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="1.0">
    <xsl:output method="text" version="1.0" encoding="UTF-8" indent="no"/>
    <xsl:template match="/">
         <xsl:value-of select="root/table[@name = 'test']/row/field[@attr3 = 'name']"/>
    </xsl:template>
</xsl:stylesheet>

结果在文件系统中保存为 .txt。 我还尝试了 .csv 和 .tab 之类的格式 - 都不适用于 excel -> 但始终在 notepad++/editor/.... 只有 excel 中的“导入对话框”以正确的形式提供字符 - 但用户想要双击文件。

【问题讨论】:

  • 这与 XSLT 无关,与 Excel 无关。您可以通过在文本编辑器中创建一个新文件、输入 München 并使用 UTF-8 编码保存它来验证这一点。然后看看你在 Excel 中打开它时会得到什么。
  • 谢谢你的解释 -> 但是如何解决这个问题?我是第一个遇到这个问题的人吗?有没有办法解决这个问题?
  • 我不知道。我不使用 Excel。我建议您在 Super User 上提问(并保留 XSLT 部分)。
  • 至于解决方法,您可以尝试生成 Excel 2002/2003 XML 格式的文件,看看是否可行。
  • 在 Notepad++ 中打开文件,然后用 BOM 将编码更改为 UTF-8,然后重新保存文件。 Excel 假定没有 BOM 的文件以 ANSI 编码进行编码,该编码因区域设置而异。

标签: excel xml csv xslt encoding


【解决方案1】:

Excel 需要 BOM(字节顺序标记)才能正确读取 UTF-8 编码的 CSV。不幸的是,我不知道在使用 1.0 版时如何通过 XSLT 添加 BOM,但您可以使用一些外部应用程序来完成它,因为它是一项微不足道的任务。如果您需要reference,我已经自己写了一个。

【讨论】:

  • bom 的选项仅在 XSLT 2.0 中可用 - 但我必须使用 1.0 - 感谢您的链接
【解决方案2】:

对于 XSLT 2.0 样式表,xsl:output 具有 byte-order-mark 属性。

byte-order-mark 属性定义是否在文件开头写入字节顺序标记。如果指定值yes,则写入字节顺序标记;如果指定了no,则不写入字节顺序标记。默认值取决于使用的编码。如果编码为UTF-16,则默认为yes;对于UTF-8,它是implementation-defined,对于所有其他编码,它是no。字节顺序标记的值表示高位字节是写在低位字节之前还是之后;实际使用的字节顺序是implementation-dependent,除非它是由所选编码定义的。

xsl:stylesheet 更改为version="2.0" 并将byte-order-mark="yes" 添加到xsl:output(显然,使用XSLT 2.0 引擎):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
    <xsl:output method="text" version="1.0" encoding="UTF-8" indent="no" byte-order-mark="yes" />
    <xsl:template match="/">
        <xsl:value-of select="root/table[@name = 'test']/row/field[@attr3 = 'name']"/>
    </xsl:template>
</xsl:stylesheet>

【讨论】:

  • 是的,但是 ArminMuc 提到“我只在 XSLT 1.0 中工作”。
  • 明白。如果 2.0 不是一个选项,答案可能对 OP 没有帮助,但其他人可能有同样的问题,这将是生成 Excel 知道读取为 UTF-8 的 CSV 的最简单方法。
  • 问题是 XSLT 1.0 的限制 - 我现在,它在 2.0 字节顺序标记中可用? =“是”| “否” 我使用的软件只有 XSLT 1.0,它在 apache 许可证 (XALAN) 中可用。据我所知,没有可用的 apache 许可证中的免费 XSLT 2.0。
  • 使用 Saxon-HE 代替 Xalan。这是一个免费的基于 Java 的 XSLT 2.0 引擎
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 2021-11-05
  • 1970-01-01
相关资源
最近更新 更多