九月= ";" 声明破坏了由XSL生成的CSV文件中的utf8 BOM

Ade*_*han 30 csv xslt excel

我目前正在使用XSLT开发CSV导出.在我的情况下,CSV文件将使用%99%的Excel,因此我必须考虑Excel行为.

我的第一个问题是csv中的德国特殊字符.即使CSV编码是UTF8,Excel也无法使用UTF8正确打开CSV文件.特殊字符变得怪异的符号.我找到了解决这个问题的方法.我刚刚添加了3个额外字节(EF BB BF - 又名BOM头),内容字节开头.因为UTF8 BOM是说'嘿伙计,它是UTF8,正确打开它'到Excel.问题解决了!

我的第二个问题是分离器.默认分隔符可以是逗号或分号,具体取决于区域.我认为它是德国的分号和英国的逗号.所以,为了防止出现这个问题,我不得不在下面添加一行:

<xsl:text>sep=;</xsl:text>
Run Code Online (Sandbox Code Playgroud)

要么

<xsl:text>sep=,</xsl:text>
Run Code Online (Sandbox Code Playgroud)

(此分隔符未实现为硬编码)

但我找不到任何解决方案的问题是,如果你添加"sep =;" 或者,当使用UT8-BOM生成CSV文件时,文件的开头"sep =",BOM无法再正确显示特殊字符!我确信BOM字节总是在字节数组的开头.此屏幕截图来自Mac OS X中的MS Excel:

在此输入图像描述

前3个符号属于BOM表头.

你有没有想过这个问题,或者你有什么建议吗?谢谢.

编辑:

我分享了打印屏幕.

一个.BOM和 <xsl:text>sep=;</xsl:text>

在此输入图像描述

湾 只是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
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

Luk*_*age 9

你是对的,当有人双击CSV文件时,Excel 2007中无法让它在不同的语言环境中正确加载编码和分隔符.

看起来当你在BOM之后指定sep =时它会忘记BOM告诉它它是UTF-8.

您必须指定BOM,因为在某些区域设置中Excel不会检测到分隔符.例如,在丹麦语中,默认的分隔符是;.如果输出制表符或逗号分隔文本,则它不会检测到分隔符,而在其他语言环境中,如果您使用分号分隔则不会加载.您可以通过更改Windows设置中的locae格式来测试它 - excel然后选择它.

从这个问题: 是否可以强制Excel自动识别UTF-8 CSV文件?

而答案似乎唯一的方法是使用带有BOM的UTF16 le编码.

另请注意,根据http://wiki.scn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator?original_fqdn=wiki.sdn.sap.com ,似乎如果你使用utf16-le与标签分隔符然后它的工作原理.

我想知道excel是否读取sep =; 然后重新调用该方法来获取CSV文本并丢失BOM - 我尝试过不正确的文本,我找不到任何解决方法告诉excel同时采用sep和编码.


Pie*_*eau 9

这是我使用Excel 2013进行测试的结果.

如果你坚持使用UTF-8,有一个解决方法,包括BOM +数据+ sep =;

输入(用UTF8编码写)

\ufeffSome;Header;Columns Wîth;Fàncÿ;Stûff sep=;

产量 |Some|Header|Columns| |Wîth|Fàncÿ |Stûff | |sep=| | |

解决方案的问题是,当Excel sep=;正确解释时,它会在最后一行的第一列显示sep=(是的,它吞下;).

但是,如果您可以将文件写为UTF16-LE,那么就有一个实际的解决方案.使用\t分隔符而不指定sep,Excel将播放球.

输入(用UTF16-LE编码编写)

\ufeffSome;Header;Columns Wîth;Fàncÿ;Stûff

产量 |Some|Header|Columns| |Wîth|Fàncÿ |Stûff |