【问题标题】:What charset does Microsoft Excel use when saving files?Microsoft Excel 在保存文件时使用什么字符集?
【发布时间】:2010-10-05 05:54:14
【问题描述】:

我有一个 Java 应用程序,它可以读取在 Excel 中创建的 CSV 文件(例如 2007 年)。有谁知道 MS Excel 使用什么字符集来保存这些文件?

我也猜到了:

  • windows-1255 (Cp1255)
  • ISO-8859-1
  • UTF8

但我无法使用这些字符集类型中的任何一种解码扩展字符(例如法语重音字母)。

【问题讨论】:

    标签: excel encoding character-encoding


    【解决方案1】:

    从内存中,Excel 使用机器特定的 ANSI 编码。因此,对于 EN-US 安装,这将是 Windows-1252,对于俄语安装是 1251,等等。

    【讨论】:

    • 是的,但 Excel 2007 允许用户(如果他们能找到“工具”按钮!)从长列表中进行选择; “ANSI”是默认值。
    • 它应该是这样工作的,但是功能被破坏了。 Excel 不支持您在另存为对话框/工具菜单/Web 选项项/编码选项卡中选择的“将此文档另存为:”选项,而是仅使用您在区域和语言设置中设置的代码页。
    • 这个答案相当正确。我在中文机器上测试,默认csv(不是utf8选项)保存为GB2312。在没有通知的情况下,Windows 上的事情是如此“默认”。顺便说一句,为什么这个答案不是公认的答案?
    【解决方案2】:

    CSV 文件可以是任何格式,具体取决于在从 Excel 导出期间指定的编码选项:(保存对话框、工具按钮、Web 选项项、编码选项卡)

    更新:Excel(包括 Office 2013)实际上并不尊重在“另存为...”对话框中选择的 Web 选项,因此这是某种错误。我现在只是使用 OpenOffice Calc 打开我的 XLSX 文件并将它们导出为 CSV 文件(编辑过滤器设置,选择 UTF-8 编码)。

    【讨论】:

    • 默认编码是“ANSI”,通常是cp1250到cp1258之一。
    • “Web 选项”不适用于 CSV 导出(至少对于 Excel 2007)。 CSV 文件的编码似乎遵循安装的默认编码。所以它可以是任何东西,在实践中。可悲的是,似乎没有办法在出口时控制这一点。
    • 确认 Web 选项设置也不适用于 Excel 2010 中的 CSV 导出。请对此答案投反对票,这是不正确的。
    • 与其否决答案,这在技术上是正确的,我们为什么不都提交一个错误报告@Microsoft 关于这个损坏的功能。 “在从 Excel 导出期间指定的编码选项”是您计算机的区域和语言设置中的选项,而不是 Web 选项中的编码选项卡。编码选项卡选项显示“将此文档另存为:”,因此它应该适用于正在保存的文档,适用于文本编码适用的任何基于文本的格式。解决方法是更改​​您的区域和语言设置,但它需要重新启动,并且仍然使用代码页。
    • 我切换到 Open Office 的另一个原因,它可以正确处理编码。当您选择“文本 CSV”时,您可以选中“编辑过滤器设置”复选框,它将显示一个窗口,允许您选择字符集(默认为西欧 (Windows-1252))、字段分隔符 (逗号、分号、冒号、空格或制表符)和文本分隔符(双引号或单引号)。这两个相似的软件处理 CSV 导出的方式之间的对比令人兴奋。 OpenOffice.org Calc 破坏 Excel。
    【解决方案3】:

    唤醒这个旧线程......我们现在是 2017 年。而且 Excel 仍然无法在保留原始编码的同时将简单的电子表格保存为 CSV 格式......真是太棒了。

    幸运的是,Google 文档生活在正确的世纪。我的解决方案是使用 Google Docs 打开电子表格,而不是将其下载为 CSV。结果是一个正确编码的 CSV 文件(所有字符串都以 UTF8 编码)。

    【讨论】:

    • 是的,简直太棒了。
    【解决方案4】:

    上周我遇到了类似的问题。我收到了许多不同编码的 CSV 文件。在导入数据库之前,我使用chardet libary 自动检测出正确的编码。

    Chardet 是 Mozilla 字符检测引擎的一个端口,如果样本量足够大(一个重音字符不行),效果会非常好。

    【讨论】:

    • chardet 很有帮助(我在 GB2312 下测试过),但不推荐使用原始链接。这是最新的 github 链接:github.com/chardet/chardet
    【解决方案5】:

    Russian Edition 提供CSVCSV (Macintosh)CSV (DOS)

    当以纯CSV 保存时,它使用windows-1251

    我只是尝试将法语单词Résumé 与俄语文本一起保存,它保存在HEX 中,例如52 3F 73 75 6D 3F3FASCIIquestion mark 代码。

    当我打开 CSV 文件时,这个词当然变得不可读了 (R?sum?)

    【讨论】:

    • 对我来说也一样。我只能保存系统语言字符集/编码中的字符。否则我必须保存为 utf8 csv 文件。
    【解决方案6】:

    如果您选择 File > Save As > Unicode Text (.txt),Excel 2010 会保存一个 UTF-16/UCS-2 TSV 文件。它是(强制)后缀“.txt”,您可以将其更改为“.tsv”。

    如果您需要 CSV,您可以在 Notepad++、Ultra Edit、Crimson Editor 等文本编辑器中转换 TSV 文件,将制表符替换为分号、逗号等。请注意,例如对于读取数据库表,TSV 通常已经可以正常工作(而且手动读取通常更容易)。

    如果您需要 UTF-8 等不同的代码页,请使用上述编辑器之一进行转换。

    【讨论】:

      【解决方案7】:

      cp1250 广泛用于 Microsoft Office 文档,包括 Word 和 Excel 2003。

      http://en.wikipedia.org/wiki/Windows-1250

      确认这一点的简单方法是:

      1. 创建一个包含高阶字符的电子表格,例如其中一个牢房中的“Veszprém”;
      2. 使用您最喜欢的脚本语言来解析和解码电子表格;
      3. 看看你的脚本在你打印出解码后的数据时会产生什么。

      perl 脚本示例:

      #!perl
      
      use strict;
      
      use Spreadsheet::ParseExcel::Simple;
      use Encode qw( decode );
      
      my $file    = "my_spreadsheet.xls";
      
      my $xls     = Spreadsheet::ParseExcel::Simple->read( $file );
      my $sheet   = [ $xls->sheets ]->[0];
      
      while ($sheet->has_data) {
      
          my @data = $sheet->next_row;
      
          for my $datum ( @data ) {
              print decode( 'cp1250', $datum );
          }
      
      }
      

      【讨论】:

      • “cp1250 在 Microsoft Office 文档中被广泛使用”......在你的树林里。 cp125n 在世界范围内被广泛使用,对于 0
      【解决方案8】:

      虽然将包含特殊字符的 excel 文件导出到 csv 确实很麻烦,但是有一个简单的解决方法:只需将单元格复制/粘贴到 google 文档中,然后从那里保存。

      【讨论】:

      • 听起来他们在寻找程序化解决方案。复制和粘贴并不真正“符合要求”。此外,这个问题相当老了。最好避免恢复旧线程,除非响应比以前的响应贡献了一些重要的东西。 )
      • 好吧,如果你这么说的话。但是,评分最高的答案不起作用(请参阅 cmets),它也不是程序化解决方案。此外,我的解决方案有效。最后,主题可能是旧的,在谷歌搜索问题时仍然会在第一页弹出,并且线程上没有工作解决方案,但我的。
      • 其实cmets说是bug。他们还提出了两种选择,显然并不理想:OpenOffice 或修改区域和语言设置。所以我不确定这个建议对那些已经给出的建议有何重大改进。现在,如果在以后的版本中有修复程序,或者程序化替代方案,我相信其他人会很乐意听到它。
      • 如果您想以编程方式进行转换,只需通过iconv 命令传递文档即可。简单易行。存在用于 Windows 的iconv 端口。见fileformat.info/tip/linux/iconv.htm
      【解决方案9】:

      您可以使用此 Visual Studio VB.Net 代码来获取编码:

      Dim strEncryptionType As String = String.Empty
      Dim myStreamRdr As System.IO.StreamReader = New System.IO.StreamReader(myFileName, True)
      Dim myString As String = myStreamRdr.ReadToEnd()
      strEncryptionType = myStreamRdr.CurrentEncoding.EncodingName
      

      【讨论】:

      • StreamReader 没有检测到编码,它是defaults to UTF-8。所以这将始终返回 UTF-8。
      【解决方案10】:

      您可以使用编码 UTF8 + BOM (https://en.wikipedia.org/wiki/Byte_order_mark) 创建 CSV 文件。

      前三个字节是 BOM (0xEF,0xBB,0xBF),然后是 UTF8 内容。

      【讨论】:

        【解决方案11】:

        OOXML 根据维基百科的说法,来自 Excel 2007 的文件以 UTF-8 编码。我不知道 CSV 文件,但按道理它会使用相同的格式...

        【讨论】:

          猜你喜欢
          • 2013-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多