在Mac和Windows上,哪种编码可以使用Excel正确正确打开CSV文件?

Which encoding opens CSV files correctly with Excel on both Mac and Windows?

我们有一个Web应用程序,可以导出包含UTF-8的外来字符的CSV文件,没有BOM。 Windows和Mac用户都在Excel中获得垃圾字符。 我尝试用BOM转换为UTF-8; Excel / Win很好用,Excel / Mac显示乱码。 我正在使用Excel 2003 / Win,Excel 2011 / Mac。
这是我尝试过的所有编码:

1
2
3
4
5
6
7
8
9
Encoding  BOM      Win                            Mac
--------  ---      ----------------------------   ------------
utf-8     --       scrambled                      scrambled
utf-8     BOM      WORKS                          scrambled
utf-16    --       file not recognized            file not recognized
utf-16    BOM      file not recognized            Chinese gibberish
utf-16LE  --       file not recognized            file not recognized
utf-16LE  BOM      characters OK,                 same as Win
                   row data all in first field

最好的是具有BOM的UTF-16LE,但CSV不被识别。 字段分隔符是逗号,但分号不会改变。

是否有任何编码在两个世界都有效?


Excel编码

我发现在处理Excel时,WINDOWS-1252编码受挫最少。由于它基本上是微软自己专有的字符集,因此可以假定它可以在Mac和Windows版本的MS-Excel上运行。这两个版本至少都包含一个正确读取数据的相应"文件源"或"文件编码"选择器。

根据您的系统和所用工具的不同,此编码也可以命名为CP1252ANSIWindows (ANSI)MS-ANSI或仅仅是Windows

此编码是ISO-8859-1(又名LATIN1和其他)的超集,因此如果由于某种原因不能使用WINDOWS-1252,则可以回退到ISO-8859-1。请注意,ISO-8859-1缺少WINDOWS-1252中的某些字符,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| Char | ANSI | Unicode | ANSI Hex | Unicode Hex | HTML entity | Unicode Name                               | Unicode Range            |
| €    | 128  | 8364    | 0x80     | U+20AC      |       | euro sign                                  | Currency Symbols         |
| ?    | 130  | 8218    | 0x82     | U+201A      | ‚     | single low-9 quotation mark                | General Punctuation      |
| ?    | 131  | 402     | 0x83     | U+0192      | ƒ      | Latin small letter f with hook             | Latin Extended-B         |
| ?    | 132  | 8222    | 0x84     | U+201E      | „     | double low-9 quotation mark                | General Punctuation      |
| …    | 133  | 8230    | 0x85     | U+2026      | …    | horizontal ellipsis                        | General Punctuation      |
| ?    | 134  | 8224    | 0x86     | U+2020      |     | dagger                                     | General Punctuation      |
| ?    | 135  | 8225    | 0x87     | U+2021      |     | double dagger                              | General Punctuation      |
| ?    | 136  | 710     | 0x88     | U+02C6      | ˆ      | modifier letter circumflex accent          | Spacing Modifier Letters |
| ‰    | 137  | 8240    | 0x89     | U+2030      | ‰    | per mille sign                             | General Punctuation      |
| ?    | 138  | 352     | 0x8A     | U+0160      | Š    | Latin capital letter S with caron          | Latin Extended-A         |
| ?    | 139  | 8249    | 0x8B     | U+2039      |     | single left-pointing angle quotation mark  | General Punctuation      |
| ?    | 140  | 338     | 0x8C     | U+0152      | Œ     | Latin capital ligature OE                  | Latin Extended-A         |
| ?    | 142  | 381     | 0x8E     | U+017D      |             | Latin capital letter Z with caron          | Latin Extended-A         |
| ‘    | 145  | 8216    | 0x91     | U+2018      | ‘     | left single quotation mark                 | General Punctuation      |
| ’    | 146  | 8217    | 0x92     | U+2019      |      | right single quotation mark                | General Punctuation      |
|"    | 147  | 8220    | 0x93     | U+201C      |      | left double quotation mark                 | General Punctuation      |
|"    | 148  | 8221    | 0x94     | U+201D      |      | right double quotation mark                | General Punctuation      |
| ?    | 149  | 8226    | 0x95     | U+2022      |       | bullet                                     | General Punctuation      |
| –    | 150  | 8211    | 0x96     | U+2013      |      | en dash                                    | General Punctuation      |
| —    | 151  | 8212    | 0x97     | U+2014      |      | em dash                                    | General Punctuation      |
| ?    | 152  | 732     | 0x98     | U+02DC      | ˜     | small tilde                                | Spacing Modifier Letters |
| ?    | 153  | 8482    | 0x99     | U+2122      | ™     | trade mark sign                            | Letterlike Symbols       |
| ?    | 154  | 353     | 0x9A     | U+0161      | š    | Latin small letter s with caron            | Latin Extended-A         |
| ?    | 155  | 8250    | 0x9B     | U+203A      |     | single right-pointing angle quotation mark | General Punctuation      |
| ?    | 156  | 339     | 0x9C     | U+0153      | œ     | Latin small ligature oe                    | Latin Extended-A         |
| ?    | 158  | 382     | 0x9E     | U+017E      |             | Latin small letter z with caron            | Latin Extended-A         |
| ?    | 159  | 376     | 0x9F     | U+0178      | Ÿ      | Latin capital letter Y with diaeresis      | Latin Extended-A         |

请注意,缺少欧元符号。
可以在艾伦·伍德找到这张桌子。

转变

每种工具和语言的转换方式都不同。但是,假设您有一个文件query_result.csv,您知道该文件是UTF-8编码的。使用iconv将其转换为WINDOWS-1252

1
iconv -f UTF-8 -t WINDOWS-1252 query_result.csv > query_result-win.csv


对于带有BOM的UTF-16LE,如果使用制表符作为分隔符而不是逗号,Excel将识别字段。它起作用的原因是Excel实际上最终使用了它的Unicode * .txt解析器。

警告:如果文件在Excel中编辑并保存,它将保存为制表符分隔的ASCII。现在的问题是,当您重新打开文件时,Excel假定它是真实的CSV(带有逗号),并看到它不是Unicode,因此将其解析为逗号分隔-因此将对其进行哈希处理!

更新:尽管至少在以下情况下,保存行为似乎有所不同,但至少在Excel 2010(Windows)中,上述警告今天对我来说似乎没有发生。

  • 您编辑并退出Excel(尝试另存为'Unicode * .txt')

相比:

  • 仅编辑和关闭文件(按预期工作)。


缺点是:没有解决方案。无论您使用什么编码或箍跳,Excel 2011 / Mac都无法正确解释包含变音符号和变音符号的CSV文件。我很高兴听到有人告诉我不同??!


您只尝试过以逗号分隔和以分号分隔的CSV。如果您尝试使用制表符分隔的CSV(也称为TSV),则会找到答案:

UTF-16LE与BOM(字节顺序标记),制表符分隔

但是:在评论中,您提到TSV并不是您的选择(尽管我无法在您的问题中找到此要求)。太可惜了。这通常意味着您允许手动编辑TSV文件,这可能不是一个好主意。目视检查TSV文件不是问题。此外,可以将编辑器设置为显示特殊字符以标记选项卡。

是的,我在Windows和Mac上进行了尝试。


在Mac上使用UTF-8读取CSV文件的最佳解决方法是将它们转换为XLSX格式。我找到了Konrad Foerstner制作的脚本,通过添加对不同定界符的支持,我对该脚本进行了一些改进。

从Github下载脚本https://github.com/brablc/clit/blob/master/csv2xlsx.py。为了运行它,您将需要安装用于Excel文件操作的python模块openpyxl:sudo easy_install openpyxl


这是将utf8编码的CSV导入到Mac的Excel 2011中的关键:微软说:" Mac的Excel当前不支持UTF-8。" Excel for Mac 2011和UTF-8

是的,去MS的方式!


以下在Excel for Mac 2011和Windows Excel 2002上为我工作:

  • 在Mac上使用iconv,将文件转换为UTF-16 Little-Endian +将其命名为* .txt(.txt扩展名强制Excel运行文本导入向导):

    iconv -f UTF-8 -t UTF-16LE filename.csv >filename_UTF-16LE.csv.txt

  • 在Excel中打开文件,然后在"文本导入向导"中选择:

    • 第1步:文件来源:忽略它,你选择什么并不重要
    • 第2步:为分隔符和文本限定符选择适当的值
    • 步骤3:如有必要,请选择列格式
  • PS iconv创建的UTF-16LE在开始时具有BOM字节FF FE。

    PPS我的原始csv文件是在Windows 7计算机上以UTF-8格式创建的(开头是BOM字节EF BB BF)并使用了CRLF换行符。逗号用作字段分隔符,单引号用作文本限定符。它包含ASCII字母以及带有波浪号,变音符等的不同拉丁字母,以及一些西里尔字母。所有这些在Excel for Win和Mac中均正确显示。

    PPPS精确软件版本:
    * Mac OS X 10.6.8
    * Excel for Mac 2011 v.14.1.3
    * Windows Server 2003 SP2
    * Windows Excel 2002 v.10.2701.2625


    在我的案例中,这有效(Mac,Excel 2011,西里尔字母和拉丁字母以及捷克音符号):

    • 字符集UTF-16LE(仅UTF-16不够)
    • BOM" xFF xFE"
    • t(制表符)作为分隔符
    • 别忘了编码分隔符和CRLF :-)
    • 使用iconv而不是mb_convert_encoding

    在我的Mac OS上,Text Wrangler将使用Excel创建的CSV文件识别为具有"Western"编码。

    经过一番谷歌搜索后,我做了这个小脚本(我不确定Windows的可用性,也许可以使用Cygwin?):

    $ cat /usr/local/bin/utf8.sh

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash

    INPUTFILE="$1"

    iconv -f macroman -c -t UTF-8 $INPUTFILE |tr '
    ' '
    ' >/tmp/file.$$.csv

    mv $INPUTFILE ms_trash
    mv /tmp/file.$$.csv $INPUTFILE


    没有BOM的UTF-8目前适用于Excel Mac 2011 14.3.2。

    UTF-8 + BOM类工作,但BOM呈现为乱码。

    如果导入文件并完成向导,则UTF-16可以工作,但如果只是双击它则不行。


    以我的情况看来,用于Mac OS的Excel 2011并未按照我的想法使用Encoding.GetEncoding(" 10000"),并浪费了2天的时间,但与Microsoft OS上的ISO相同。
    最好的证明是在Excel 2011中为MAC创建带有特殊字符的文件,将其另存为CSV,然后在MAC文本编辑器中将其打开,然后对字符进行加密。

    对我来说这种方法很有效 - 这意味着在MAC OS上的Excel 2011上的csv导出里面有特殊的西欧式字符:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Encoding isoMacOS = Encoding.GetEncoding("iso-8859-1");
    Encoding defaultEncoding = Encoding.Default;

    // Convert the string into a byte array.
    byte[] defaultEncodingBytes = defaultEncoding.GetBytes(exportText);

    // Perform the conversion from one encoding to the other.
    byte[] ansiBytes = Encoding.Convert(defaultEncoding, isoMacOS, defaultEncodingBytes);

    decodedString = isoMacOS.GetString(ansiBytes);


    以我为例,将Preamble添加到文件中解决了我的问题:

    1
    2
    3
    var data = Encoding.UTF8.GetBytes(csv);
    var result = Encoding.UTF8.GetPreamble().Concat(data).ToArray();
    return File(new MemoryStream(result),"application/octet-stream","data.csv");

    使用java(带BOM的UTF-16LE)解决这个问题:

    1
    2
    3
    4
    5
    String csvReportStr = getCsvReport();
    byte[] data = Charset.forName("UTF-16LE").encode(csvReportStr)
        .put(0, (byte) 0xFF)
        .put(1, (byte) 0xFE)
        .array();

    请注意,CSV文件应使用TAB作为分隔符。您可以在Windows和MAC OS X上均读取CSV文件。

    请参阅:如何使用BOM编码/解码UTF-16LE字节数组?


    这适合我

  • 在BBEdit或TextWrangler *中打开文件。
  • 将文件设置为Unicode(UTF-16 Little-Endian)(行尾可以是Unix或Windows)。救!
  • 在Excel中:数据>获取外部数据>导入文本文件...
  • 现在要点,选择MacIntosh作为文件来源(应该是首选)。

    这是使用Excel 2011(版本14.4.2)

    *窗口底部有一点下拉


    而不是csv,请尝试输出具有XLS扩展名和" application / excel" mime类型的html。我知道这可以在Windows中运行,但不能代表MacOS