我正在使用XSLT开发CSV导出功能,并且CSV文件将在我的情况下99%与Excel一起使用,因此我必须考虑Excel的行为。
我的第一个问题是CSV中的德语特殊字符。尽管CSV编码为UTF8,但Excel无法正确打开带有UTF8的CSV文件。特殊字符变成了奇怪的符号。我找到了解决这个问题的方法。我只需在内容字节开始处添加3个额外的字节(EF BB BF - 也称为BOM头)。因为UTF8 BOM可以告诉Excel“嘿,老兄,这是UTF8,请正确打开它”。问题解决了!
我的第二个问题是关于分隔符。默认分隔符可能是逗号或分号,取决于地区。我认为在德国是分号,在英国是逗号。为了避免这个问题,我不得不添加以下行:
<xsl:text>sep=;</xsl:text>
或者<xsl:text>sep=,</xsl:text>
(此分隔符未作为硬编码实现)
我的问题是,如果您在生成带有UT8-BOM的CSV文件时在文件开头添加“sep =;”或“sep =,”,则BOM不再有助于正确显示特殊字符!我确信BOM字节始终位于字节数组的开头。这张屏幕截图来自Mac OS X中的MS Excel:
前3个符号属于BOM标头。
您是否曾经遇到过这样的问题,或者您有任何建议?谢谢。
编辑:
我分享了打印屏幕。
a. 带BOM和 <xsl:text>sep=;</xsl:text>
b. 仅带BOM
Java代码:
// Write the bytes
ServletOutputStream out = resp.getOutputStream();
if(contentType.toString().equals("CSV")) {
// The additional bytes in below is prefix indicates that the content is in UTF-8.
out.write(239);
out.write(187);
out.write(191);
}
out.write(bytes); // Content bytes, in this case XSL
XSL 代码:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<xsl:text>sep=;</xsl:text>
<table>
...
</table>
</xsl:template>
sep=;
而不是 BOM 头吗? - Marcus Rickert