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

 张哥他爹 发布于 2023-02-12 18:02

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

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

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

sep=;

要么

sep=,

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

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

在此输入图像描述

前3个符号属于BOM表头.

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

编辑:

我分享了打印屏幕.

一个.BOM和 sep=;

在此输入图像描述

湾 只是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代码:






    
    sep=;
    
        ...
        

Luke Page.. 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和编码.

2 个回答
  • 你是对的,当有人双击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和编码.

    2023-02-12 18:04 回答
  • 这是我使用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 |

    2023-02-12 18:04 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有