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


137

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

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。字段分隔符是逗号,但分号不会更改任何内容。

有没有两种编码都可以使用?


1
如果对所有字段数据都使用UTF-16LE但对逗号使用8bit / ASCII字符怎么办?根据本文(creativyst.com/Doc/Articles/CSV/CSV01.htm#CSVAndEncodings),Excel可能会将Unicode逗号解释为字段数据的一部分,而不是分隔符。
jveazey 2011年

1
有趣的提示@jveazey。我会尝试的:mb_convert_encoding($str, "UTF-16LE");在我的导出代码中,并将结果发布在这里。
Timm,

但这并不能帮助您,但是我在Windows上测试了Excel 2007 SP2(使用Notepad2创建测试文件)。除了UTF-16LE BOM(与Windows上的结果相同)和UTF-16BE BOM(可正确解析字段,但BOM作为A1的前2个字符)外,其他所有东西都起作用。
2011年


@hveazey,引用的问题可以通过推荐代码页Windows-1252来获得解答。这对我的情况不起作用(德国变音符和Sharp的)。
Timm 2012年

Answers:


61

Excel编码

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

根据您的系统和使用的工具上,该编码也可以被命名为CP1252ANSIWindows (ANSI)MS-ANSI或只Windows,其他变化之中。

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

| 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         |

请注意,缺少欧元符号。可以在Alan Wood上找到此表。

转换次数

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

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

6
有点麻烦,但这似乎是将带有欧洲字符的.csv文件导入Mac OSX上的Excel的答案
Fergie 2014年

1
真正。它代替了OP的问题。在您的情况下,您首先必须知道(或猜测)“带有欧洲字符的.csv文件”中使用的编码。然后,您可以将其转换为WINDOS-1252,很可能会被Mac和Windows Excel正确解释。
mikezter 2014年

1
这不是真正的解决方案,迟早您会遇到无法转换为WINDOWS-1252的字符。
Walter Tross 2015年

2
如果有中文字符,WINDOWS-1252将失败。因此,带有BOM的UTF-16LE似乎是唯一的选择。
XWang 2015年

这对于带有变音符号的SQL数据导出效果很好。
motorbaby

26

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

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

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

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

相比:

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

1
很好,但是需要注意的是我无法解决问题。最终用户将对损坏的Excel工作表不满意。
Timm

可能的是,如果将初始文件扩展名更改为* .txt,它可以工作,但是随后您将失去文件类型和Excel之间的关联:即,他们无法双击文件并自动在Excel中打开它。
Duncan Smart

那对我是行不通的。由于不精通计算机,最终用户需要在Excel中打开它而没有任何障碍。
Timm

我的“ .csv” Excel工作表看起来很好,带有特殊字符和分隔的字段。我将输出字符串以“ \ ufeff”作为字节顺序标记(BOM)开始,然后使用“ \ t”选项卡代替逗号进行字段分隔,并使用“ utf-16LE”对文件进行编码。得益于此页面,您的作品魅力十足!
Geek Stocks 2013年

第一行sep=,和UTF16LE编码对我有用,并且不需要其他分隔符(它仍然是逗号)。通过双击打开文件可以正确加载文件,并在单元格内保留特殊字符和换行符。缺点:sep=,据我所知,除Excel以外的任何程序都无法识别标头。但是无论如何,OpenOffice / LibreOffice都不需要此技巧(单元格内容中的换行符工作得很好,而在Excel中从文本文件加载/使用文本加载到列助手中不能正确处理单元格中的换行符)。
CodeManX

24

缺点是:没有解决方案。Excel 2011 / Mac不能正确解释包含变音符号和变音符号的CSV文件,无论您执行哪种编码或箍跳转。我很高兴听到有人告诉我与众不同!


4
我发现WIN-1252或ISO-8859-1编码正在工作。请看我的回答。
mikezter 2013年

3
解决方案是使用UTF-16LE,并确保使用制表符分隔列而不是逗号。
蒂姆·格罗内维尔德

您真的在Win和Mac Tim上尝试过吗?如前所述,在我的情况下,TSV不是一个选择。
Timm 2014年

1
对我来说,如果我在Mac和Windows版本的Excel上都使用WIN-1252编码,则导出工作正常。@Timm,您应该考虑更改接受的答案。
皮埃尔·阿诺

2
对于那些认为可行的人,您实际上在数据集中扩展了字符(如中文)吗?WIN-1252编码在这些编码上中断,因为它们超出了范围。
Bill Leeper 2014年

11

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

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


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

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



4

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

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


3

在我的情况下,此方法有效(Mac,Excel 2011,西里尔字母和拉丁字母以及捷克音符号):

  • 字符集UTF-16LE(仅UTF-16不够)
  • BOM“ \ xFF \ xFE”
  • \ t(制表符)作为分隔符
  • 不要忘了还要编码分隔符和CRLF :-)
  • 使用iconv代替mb_convert_encoding

2

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

对我而言,这种方法有效-意味着在MAC OS上的Excel 2011上的csv导出在其中包含特殊的西欧字符:

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);

您正在使用哪种语言@ user525081?您可以将其翻译成PHP吗?
Timm

@Timm看起来像Java示例,但是在PHP中,您可以使用iconv进行转换-de3.php.net/manual/en/function.iconv.php
Ashish Datta

OK @ user525081,与其他答案相同。这迎合了Mac用户,使Windows用户陷入困境。而且它无法回答最初的问题-一种在两种平台上均可使用的编码。谢谢。
Timm

2

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

UTF-8 + BOM可以工作,但是BOM呈现为乱码。

如果导入文件并完成向导,则UTF-16起作用,但是如果您双击它,则不起作用。


2

以下内容适用于Mac 2011和Windows Excel 2002的Excel:

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

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

  2. 在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 Exact软件版本:
* Mac OS X 10.6.8
* Mac版本的Excel 2011 v.14.1.3
* Windows Server 2003 SP2
* Windows Excel 2002 v.10.2701.2625


如果您有不带BOM的UTF-8文件,iconv会将其转换为不带 BOM的UTF-16LE (不幸的是,没有办法告诉iconv添加一个文件)
Walter Tross 2015年

2

在我的Mac OS上,Text Wrangler将使用Excel创建的CSV文件标识为“西方”编码。

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

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

#!/bin/bash

INPUTFILE="$1"

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

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

这是在OS X 10.14.2(和Excel 2011)上对我唯一起作用的东西
Donald

1

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

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

0

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


感谢@ royce23,但我只是提供CSV文件供下载。我无法通过HTTP呈现它,因为标记的绝对大小会减慢对爬网的响应-导出的表可能包含数百万行...
Timm

使用css,您的html只会比csv大一小部分,例如:<r> <c> id </ c> <c>名称</ c> <c>电话</ c> </ r>
royce3

不知道我是否理解,但是我正在将CSV保存在服务器上并提供下载链接。生成HTML响应会占用过多的PHP内存...
Timm,2012年

这将起作用(UTF-8字符),但是如果您在单元格(br标记)中嵌入了换行符,则Excel for Mac会忽略(适用于Windows)CSS mso-data-placement:same-cell;
冗长的

0

这对我有用

  1. 在BBEdit或TextWrangler *中打开文件。
  2. 将文件设置为Unicode(UTF-16 Little-Endian)(行尾可以是Unix或Windows)。保存!
  3. 在Excel中:数据>获取外部数据>导入文本文件...

现在要点,选择MacIntosh作为“文件来源”(应该是首选)。

这是使用Excel 2011(版本14.4.2)

*窗口底部有一个下拉菜单


0

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

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字节数组进行编码/解码?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.