当前位置:  开发笔记 > 编程语言 > 正文

Microsoft Excel在.csv文件中破坏了变音符号?

如何解决《MicrosoftExcel在.csv文件中破坏了变音符号?》经验,为你挑选了7个好方法。

我以编程方式将数据(使用PHP 5.2)导出到.csv测试文件中.
示例数据:( Numéro 1注意重音e).数据是utf-8(没有前置BOM).

当我在MS Excel中打开此文件时显示为Numéro 1.

我可以在文本编辑器(UltraEdit)中打开它,正确显示它.UE报告角色是decimal 233.

如何在.csv文件中导出文本数据以便MS Excel正确呈现它,最好不强制使用导入向导或非默认向导设置?



1> James Baker..:

格式正确的UTF8文件可以将字节顺序标记作为其前三个八位字节.这些是十六进制值0xEF,0xBB,0xBF.这些八位字节用于将文件标记为UTF8(因为它们与"字节顺序"信息无关).1 如果此BOM不存在,则消费者/读者可以推断文本的编码类型.不支持UTF8的读取器将读取字节作为某些其他编码(如Windows-1252),并在文件的开头显示字符.

有一个已知的错误,在通过文件关联打开UTF8 CSV文件时,Excel假定它们采用单字节编码,而忽略了UTF8 BOM的存在.这可以通过任何系统默认代码页或语言设置是固定的.BOM不会在Excel中提示 - 它只是不起作用.(少数报告声称BOM有时会触发"导入文本"向导.)此错误似乎存在于Excel 2003及更早版本中.大多数报告(在此处的答案中)表示这已在Excel 2007及更新版本中得到修复.

请注意,您始终可以使用"导入文本"向导在Excel中正确打开UTF8 CSV文件,该向导允许您指定要打开的文件的编码.当然这不太方便.

这个答案的读者最有可能出现这样的情况,即他们并不特别支持Excel <2007,而是将原始的UTF8文本发送到Excel,这会误解它并将文本Ã和其他类似的Windows-1252字符一起使用. 添加UTF8 BOM可能是您最好,最快的修复方法.

如果您遇到旧版Excel上的用户,并且Excel是CSV的唯一使用者,则可以通过导出UTF16而不是UTF8来解决此问题.Excel 2000和2003将双击 - 正确打开它们.(其他一些文本编辑可能会遇到UTF16问题,因此您可能需要仔细权衡您的选项.)


*除非您不能,(至少)Excel 2011 for Mac的导入向导实际上并不总是适用于所有编码,无论您告诉它什么. :)


*一般来说,*UTF-8编码的文件不应该**前面有一个字节顺序标记.UTF-8没有可变字节顺序,并将其置于破坏UTF-8的ASCII兼容性.有一些特定的文件格式允许或鼓励使用UTF-8虚假BOM,但是应该避免使用.CSV完全是编码无知的,所以任何人都猜测给定的工具是否会将字节序列0xEF 0xBB 0xBF解释为UTF-8的指示符; 第一个单元格中不可见的控制字符; 第一个单元格中的字符` 或完全不同的东西.
让我永远找到指定编码的位置.保存对话框>工具按钮> Web选项>编码选项卡.他们肯定善于隐藏这些重要的事情.
错误:向UTF-8文件添加BOM会正确加载该文件,而无需Excel 2007中的导入向导.
我们发现了与Victor今天所说的相同的事情(使用Excel 2010,它就是我们所拥有的).添加UTF-8 BOM /签名(EF BB BF)似乎修复了使用系统默认编码的双击,并正确使用UTF8 :)
@Ian:没有人确定它是带有*BOM的UTF-8* - 0xEF 0xBB 0xBF也是大多数遗留编码中的有效序列(因此它经常被误解为ISO-8859-1或cp1252并显示为"ï" ¿`).它只能帮助猜测算法,以及专门为其准备的文件格式(例如XML).在UTF-8文件中包含虚假BOM的缺点是你打破了它们的ASCII兼容性(UTF-8的一个主要卖点)许多编码无知的文本工具将面临意想不到的领先虚假BOM.
顺便说一下,它在Excel 2013中无法正常运行..CSV(TAB或;分隔符)文件被正确读取但保存时会回退到ANSI编码和TAB分隔符(WTF!).
UTF-16LE +它的BOM也适用于我,并通过双击打开Excel中的csv解决了编码问题.但对我来说,tab作为分隔符(而不是逗号)是不需要的行为.有没有办法改变这个?
啊哈......事实证明,文件开头的```sep =,```实际上打破了这个伎俩.

2> 小智..:

预先设置BOM(\ uFEFF)对我有用(Excel 2007),因为Excel将文件识别为UTF-8.否则,保存它并使用导入向导可以工作,但不太理想.


不,@ AlastairMcCormack,它取决于它的编码方式.编码为UTF-8的"\ ufeff"正好是EF BB BF.(编码为UTF-16,它只是两个字节.)

3> 小智..:

下面是我在向用户发送Microsoft Excel时在项目中使用的PHP代码:

  /**
   * Export an array as downladable Excel CSV
   * @param array   $header
   * @param array   $data
   * @param string  $filename
   */
  function toCSV($header, $data, $filename) {
    $sep  = "\t";
    $eol  = "\n";
    $csv  =  count($header) ? '"'. implode('"'.$sep.'"', $header).'"'.$eol : '';
    foreach($data as $line) {
      $csv .= '"'. implode('"'.$sep.'"', $line).'"'.$eol;
    }
    $encoded_csv = mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
    header('Content-Description: File Transfer');
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment; filename="'.$filename.'.csv"');
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv;
    exit;
  }

更新:文件名改进和BUG修复正确的长度计算.感谢TRiG和@ ivanhoe011


另请注意http://stackoverflow.com/a/10969702/209139上的进一步评论.
这很棒!我可以确认它也适用于Mac(在Office 2011中).

4> Christiaan W..:

所有Excel版本(2003 + 2007)和文件类型组合的答案

这里的大多数其他答案仅涉及他们的Excel版本,并不一定会帮助您,因为他们的答案可能不适用于您的Excel版本.

例如,添加BOM字符会引入自动列分隔符识别的问题,但不会引入每个Excel版本的问题.

有3个变量可确定它是否适用于大多数Excel版本:

编码

BOM角色存在

细胞分离器

SAP坚忍的人尝试了每一种组合并报告了结果.最终结果?使用带有BOM和制表符的UTF16le作为分隔符,使其适用于大多数Excel版本.

你不相信我?我也不会,但在这里阅读并哭泣:http://wiki.sdn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator



5> daniels..:

导入时选择UTF-8 enconding.如果您使用Office 2007,则在您选择它的位置:打开文件后立即执行.



6> Johal..:

在输出CSV数据之前回显UTF-8 BOM.这修复了Windows中的所有字符问题,但不适用于Mac.

echo "\xEF\xBB\xBF";

它适用于我,因为我需要生成一个仅在Windows PC上使用的文件.



7> 小智..:

在没有任何服务包的情况下,UTF-8在办公室2007中不起作用,有或没有BOM(U + ffef或0xEF,0xBB,0xBF,都不起作用)安装sp3使UTF-8工作时0xEF,0xBB,0xBF BOM是前缀.

UTF-16在python中使用"utf-16-le"进行编码,前面加上0xff 0xef BOM,并使用tab作为分隔符.我不得不手动写出BOM,然后使用"utf-16-le"而不是"utf-16",否则每个encode()都会将BOM前置到写出的每一行,这些行在第一列上显示为垃圾.第二行和之后.

无法判断UTF-16是否可以在没有安装任何sp的情况下工作,因为我现在无法返回.

这是在windows上,dunno关于MAC的办公室.

对于这两种工作情况,导入在直接从浏览器启动下载并且文本导入向导不干预时起作用,它的工作方式与您期望的一样.

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有