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时,
根据您的系统和所用工具的不同,此编码也可以命名为
此编码是
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 | |
请注意,缺少欧元符号。
可以在艾伦·伍德找到这张桌子。
转变
每种工具和语言的转换方式都不同。但是,假设您有一个文件
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:
这是将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运行文本导入向导):
在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文件应使用
请参阅:如何使用BOM编码/解码UTF-16LE字节数组?
这适合我
现在要点,选择MacIntosh作为文件来源(应该是首选)。
这是使用Excel 2011(版本14.4.2)
*窗口底部有一点下拉
而不是csv,请尝试输出具有XLS扩展名和" application / excel" mime类型的html。我知道这可以在Windows中运行,但不能代表MacOS