我目前正在使用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)
你是对的,当有人双击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和编码.
这是我使用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 |
| 归档时间: |
|
| 查看次数: |
15359 次 |
| 最近记录: |