Excel是否可以自动识别UTF-8格式的CSV文件?

620
我正在开发一个应用程序的一部分,负责将一些数据导出到CSV文件中。该应用程序始终使用UTF-8编码,因为它在所有层面上都具有多语言特性。但是,在Excel中打开这些包含重音符、西里尔字母和希腊字母等内容的CSV文件时,并不能达到预期的结果,显示出类似于“Г„/Г¤, Г–/Г¶”这样的内容。我不知道如何强制Excel理解打开的CSV文件是以UTF-8编码的。我还尝试了指定UTF-8 BOM“EF BB BF”,但Excel忽略了它。
是否有任何解决方法?
附注:哪些工具可能会像Excel一样表现?

更新

我必须说,我在提问的方式上让社区感到困惑了。当我提出这个问题时,我是想要一种在Excel中以流畅和透明的方式打开UTF-8格式的CSV文件,对用户没有任何问题的方法。然而,我使用了错误的表述,要求自动完成这个操作。这非常令人困惑,并且与VBA宏自动化相冲突。对于这个问题,有两个答案我最为赞赏:Alex给出的第一个答案,我已经接受了这个答案;以及稍后出现的Mark的第二个答案。从可用性的角度来看,Excel似乎缺乏友好的UTF-8 CSV支持,所以我认为两个答案都是正确的,我之所以首先接受了Alex的答案,是因为他确实指出了Excel无法透明地完成这个任务。这就是我在这里与自动混淆的地方。Mark的答案提供了一种更复杂的方法,适用于更高级的用户来实现预期的结果。两个答案都很棒,但Alex的答案稍微更符合我没有明确说明的问题。


更新2

距离上次编辑已经过去了五个月,我注意到Alex的回答不知何故消失了。我真的希望这不是技术问题,并且希望现在不再有关于哪个答案更好的讨论。因此,我接受Mark的答案作为最佳答案。


1
你能使用制表符分隔的文件吗?如果可以,你可能会更加幸运。 - Tim Perry
11
Office 2010+:最佳工作方式是使用带BOM的UTF-16LE编码,以\t作为分隔符。适用于英文和非英文Excel设定。可以直接按Ctrl-S进行保存,无需选择文件格式等操作。可以保留Unicode字符。 - Sebastian
3
Alex的回答被版主删除了。没有给出任何解释,但如果您有足够的声望,仍然可以看到它。 - Mark Ransom
1
@osexpert,你因为你的Excel 2010经验与我六年前的经验不同就给我点了个踩?好吧。我声称那时它并没有以直接的方式适用于Excel。 - Lyubomyr Shaydariv
2
这不是很疯狂吗?在这个帖子发布12年后的今天,我竟然遇到了完全相同的问题,与Excel有关。我将数据翻译成西班牙语,并将其导出为CSV文件,然后尝试在Excel中打开它。重音字符看起来像垃圾一样。微软真的会听取使用他们产品的任何人的建议吗? - hamayoun
显示剩余11条评论
33个回答

497

Alex是正确的,但由于你要导出为csv文件,你可以在打开csv文件时向用户提供以下建议:

  1. 将导出的文件保存为CSV格式
  2. 打开Excel
  3. 使用“数据”-->“从外部数据”-->“导入数据”导入数据
  4. 选择文件类型为"csv"并浏览到您的文件
  5. 在导入向导中将"文件来源"更改为"65001 UTF"(或选择正确的语言字符标识符)
  6. 更改分隔符为逗号
  7. 选择要导入到的位置并完成

使用这种方式,特殊字符应该会正确显示。


17
这是一个解决方法,但并没有回答问题。问题是如何创建CSV文件,让Excel自动选择正确的编码方式。 - Tom
1
这个答案没有任何"自动化"的内容 - mrblue6

219

30
插入UTF-8 BOM似乎是可行的方法。之后就可以透明处理了。 - vy32
28
我使用Notepad++轻松将.csv文件从 UTF-8 转换为 UTF-8带BOM - Sébastien
3
是的 - 最佳解决方案。有很多令人困惑的帖子讨论在http响应中设置头部信息的问题。这个方法解决了这个问题。当在记事本中打开文件并使用UTF-8选项保存时,可以看到相同的效果。同时还添加了字节顺序标记。 - user369142
2
@Elmue:我想也许(像我一样),他认为他已经用字节顺序标记保存了它,但实际上并没有,因为某个库的工作方式与他想象的不同。我发现添加这个答案是值得的,显然其他很多人也觉得它很有用。无论如何,这似乎比说不要使用CSV或指导用户以某种奇怪的方式打开文件更好。 - StriplingWarrior
2
@marsze:感谢您指出这一点。我在发布的链接中还有另一个答案使用了流。我想教训就是GetBytes()从来没有被设计成单独用于生成整个文件的内容:我们应该使用流并让它们调用GetPreamble()GetBytes()等方法。 - StriplingWarrior
显示剩余14条评论

93

看起来Excel 2013已经修复了忽略BOM的错误。我也遇到了使用Cyrillic字母时相同的问题,但添加BOM字符\uFEFF确实有所帮助。


9
自从我在Java生成的CSV文件开头添加了\uFEFF,Excel就能够正确打开它们了!谢谢。 - Galdo
21
这也解决了我的问题,在PHP中它看起来像这样:$utf8_with_bom = chr(239) . chr(187) . chr(191) . $csvText; - Abdullah
2
UTF-8 根据定义不使用,也不应该使用 BOM 字符。Excel 读取 BOM 的方式破坏了 UTF-8 相对于 Unicode 的优势,即与 ASCII 的向后兼容性。添加 BOM 可以使 Excel 正常工作,但会破坏其他正确的 UTF-8/ASCII 文件读取。 - Nelson
2
@MarkRansom,但这根本不是UTF-8规范。按照定义,UTF-8应该在二进制级别上与标准ASCII兼容,这意味着没有127以上的字符。其他所有字符都应该是“标准”的,没有特殊字符。微软应该做的是如果没有BOM,则默认为UTF-8,而不是默认为他们自己的MS编码。 - Nelson
1
@MarkRansom 微软在维护工作方面做得很糟糕。只需看一下这份详尽的报告,就能了解Excel在处理BOM时存在的不一致性:http://wiki.scn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator - Nelson
显示剩余6条评论

81
很难想象有这么多答案,但是没有一个回答了这个问题:

“当我提出这个问题时,我要求一种在Excel中打开UTF-8 CSV文件且用户不会遇到任何问题的方法......”

被标记为最佳答案并获得200多个赞的答案对我来说没有用,因为我不想给我的用户一个手册来配置Excel。除此之外:这个手册只适用于一个Excel版本,而其他Excel版本拥有不同的菜单和配置对话框。你需要为每个Excel版本编写一个手册。

所以问题就是如何通过简单的双击使Excel显示UTF8数据?

至少在Excel 2007中,如果使用CSV文件,这是不可能的,因为UTF8 BOM会被忽略,你将只能看到垃圾内容。这已经是Lyubomyr Shaydariv的问题的一部分:

“我还尝试了指定UTF-8 BOM EF BB BF,但Excel会忽略它。”

我有同样的经验:将俄语或希腊语数据写入UTF8 CSV文件与BOM会导致Excel中出现垃圾内容:

UTF8 CSV文件的内容:

Colum1;Column2
Val1;Val2
Авиабилет;Tλληνικ

Excel 2007 中的结果:

CSV UTF8 Excel

一个解决方案是不要使用 CSV。这种格式被微软实现得非常愚蠢,它取决于控制面板中的区域设置,用作分隔符的字符是逗号还是分号。因此,同一份 CSV 文件在一台计算机上可能会正确打开,在另一台计算机上却无法正常打开。 "CSV" 的意思是 "逗号分隔值",但例如在德语 Windows 上,默认情况下必须使用分号作为分隔符,逗号不起作用。(在这里应该称为 SSV = 分号分隔值)CSV 文件不能在不同语言版本的 Windows 之间交换。这是 UTF-8 问题的另一个问题。

Excel 存在数十年了。 微软多年来竟然无法实现如此基本的事情,即 CSV 导入,真是可惜。


然而,如果您将相同的值放入 HTML 文件中,并将该文件保存为 UTF8 带 BOM 的文件扩展名为XLS,您将获得正确的结果。

UTF8 XLS 文件的内容:

<table>
<tr><td>Colum1</td><td>Column2</td></tr>
<tr><td>Val1</td><td>Val2</td></tr>
<tr><td>Авиабилет</td><td>Tλληνικ</td></tr>
</table>

Excel 2007中的结果:

UTF8 HTML Excel

你甚至可以在HTML中使用颜色,Excel会正确显示。

<style>
.Head { background-color:gray; color:white; }
.Red  { color:red; }
</style>
<table border=1>
<tr><td class=Head>Colum1</td><td class=Head>Column2</td></tr>
<tr><td>Val1</td><td>Val2</td></tr>
<tr><td class=Red>Авиабилет</td><td class=Red>Tλληνικ</td></tr>
</table>

Excel 2007 的结果:

UTF8 HTML Excel

在这种情况下,只有表格本身具有黑色边框和线条。如果您想让所有单元格都显示网格线,在HTML中也是可能的。

<html xmlns:x="urn:schemas-microsoft-com:office:excel">
    <head>
        <meta http-equiv="content-type" content="text/plain; charset=UTF-8"/>
        <xml>
            <x:ExcelWorkbook>
                <x:ExcelWorksheets>
                    <x:ExcelWorksheet>
                        <x:Name>MySuperSheet</x:Name>
                        <x:WorksheetOptions>
                            <x:DisplayGridlines/>
                        </x:WorksheetOptions>
                    </x:ExcelWorksheet>
                </x:ExcelWorksheets>
            </x:ExcelWorkbook>
        </xml>
    </head>
    <body>
        <table>
            <tr><td>Colum1</td><td>Column2</td></tr>
            <tr><td>Val1</td><td>Val2</td></tr>
            <tr><td>Авиабилет</td><td>Tλληνικ</td></tr>
        </table>
    </body>
</html>

这段代码甚至允许指定工作表的名称(这里是"MySuperSheet")

在Excel 2007中的结果:

enter image description here


4
而且令人难以置信的是,人们仍然会回答它。 :) 然而,我认为 CSV 已经死了:CSV 是一种非常简单的流式格式,而且在我当时参与的项目中,我们还将其大量用于组件交互。我永远不会使用 HTML 格式,因为它过于表示性质,我也永远不能让该项目的用户导出数据到 HTML 中只为了使其能与 Excel 兼容。Excel 在 UTF-8 CSV 上表现得很差,而自那以后已经过去了 5 年,我不知道有什么变化。但逗号、分号和制表符分隔的文件确实是一种疯狂的做法,我想。 - Lyubomyr Shaydariv
9
因为谷歌将人们引到这里,所以人们仍然回答您的问题并不足为奇:他们都有同样的问题:如何让愚蠢的Excel按照我的意愿操作?在谷歌中输入“excel csv utf8”三个单词,您的问题就是全球搜索结果的第一个。您写了一本畅销书! - Elmue
17
既然你花时间指出其他答案都无法正确打开CSV文件,那么值得一提的是,这个答案也无法做到。原本被接受的答案(已被管理员删除)建议直接将数据导出为Excel文件,或导出HTML文件并允许用户在Excel中打开该文件。这两种解决方案都比将HTML文件保存为XLS文件扩展名要好,但没有提出真正回答问题的答案。 - StriplingWarrior
6
“@Warrior: “…但是还没有提出真正回答这个问题的答案。”这是不正确的。我已经回答了这个问题:至少在Excel 2007中是不可能的。这就是明确的答案。如果Excel忽略UTF8 BOM并将数据解释为ANSI,那么通过CSV无法通过简单的双击文件将希腊或俄罗斯文本导入Excel(这就是问题:“对于用户而言没有任何问题”)。我的建议是一个工作解决方案,在所有Excel版本中都可以通过双击使用,而不需要在Excel菜单中进行额外的步骤。” - Elmue
10
这段内容不仅没有回答问题,而且完全错误地表示CSV是“遗留”和“死亡”的。仅仅因为你认为它没用,不意味着它已经死亡。另外,你显然不了解它的历史以及它在今天的广泛应用。相对于XML(由于数据包大小更小),这还是更好的选择。问题在于Microsoft并没有遵循UTF8格式的标准。正确的答案应该是使用OpenOffice而不是Microsoft,因为Microsoft从一开始就没有擅长编码。 - Jeremy
显示剩余6条评论

59

我们使用了以下解决方法:

  1. 将CSV文件转换为UTF-16 LE编码
  2. 在文件开头插入BOM标记
  3. 使用制表符作为字段分隔符

2
谢谢!我尝试了这个帖子中的所有其他答案,但转换为UTF-8根本不起作用。当我尝试使用带BOM的UTF-16时,它立即起作用了。 - Husky
对于Excel for Mac 2011,我成功地使用UTF-16小端CSV文件。 - multidynamic
谢谢,这个解决方案非常棒,可以为我的用户提供一个Unicode CSV文件,他们可以在Excel中打开。 - LDW
3
你能更详细地解释一下如何转换为UTF-16 LE以及使用哪个BOM吗? - S.Serpooshan
这个答案完全按照相同的步骤,在Python和FastAPI中实现了相同的目标。未来的读者可能会发现它很有帮助。 - undefined

25

我曾经遇到PHP生成的CSV文件的同样问题。 当分隔符是通过在内容开头定义"sep=,\n"时(但显然位于BOM之后),Excel会忽略BOM。

所以,在内容开头添加BOM ("\xEF\xBB\xBF") 并通过 fputcsv($fh, $data_array, ";"); 设置分号作为分隔符就可以解决这个问题。


对我来说最好的答案,谢谢! - undefined

22

您可以使用Notepad++将.csv文件转换为UTF-8带BOM格式:

  1. Notepad++中打开文件。
  2. 进入菜单 编码转为 UTF-8-BOM
  3. 进入菜单 文件保存
  4. 关闭 Notepad++。
  5. 在Excel中打开文件。

适用于 Microsoft Office Professional Plus 2013 的 Microsoft Excel 2013 (15.0.5093.1000) MSO (15.0.5101.1000) 64 位,运行在 Windows 8.1 上,并将非 Unicode 程序的区域设置为“德语 (德国)”。


1
按照你说的做了,完全没有用。转换/编码、设置字符集,在我的情况下都没有起作用。将文件导入Google表格,下载为CSV,完美无缺地运行。来自2045年的感谢 - pakalbekim
4
我需要将它转换为 UTF-8-BOM 编码,方法是使用“编码”功能。这是针对 Excel 2016 版本的操作。 - Igor Vuković
1
它运行良好,只是我必须使用UTF-8 BOM保存。最终,找到了一个解决方法。 - Newbielp

18

虽然这是一个老问题,但最简单的解决方案是:

  1. 使用记事本打开CSV文件
  2. 选择“另存为” -> 选择正确的编码
  3. 打开新文件

1
你使用的Excel版本是哪个? - Lyubomyr Shaydariv
1
太棒了,简单易用,解决了问题(至少对我来说是这样)。 - Auberon Vacher
1
不行,因为问题在于要让Excel将.csv文件作为csv文件打开。我的意思是,我有一个生成csv文件的过程。然后用户只需要打开文件即可。但这里他/她需要做更多的事情。 - Veverke
2
@Veverke 如果您需要定期生成文件,那么这不是最好的解决方案。但如果只是一次性的需求,那么这个答案是完美的。它之所以有效,是因为记事本会在UTF-8或UTF-16文件的开头放置BOM。 - Mark Ransom
运行得非常好。((: - user2925795

14

我曾经遇到过同样的问题(如何生成Excel可以读取,其他工具也可以读取的文件)。我使用的是TSV而不是CSV,但是同样出现了编码问题。

我无法找到任何方法让Excel自动识别UTF-8,而且我也不愿意/能够向文件的消费者施加复杂的打开指令。因此,我将它们编码为UTF-16le(带BOM),而不是UTF-8。虽然大小增加了一倍,但Excel可以识别编码。并且它们可以压缩得很好,因此大小很少(但可悲的是不是从不)成为问题。


这是一个老问题,但我很高兴人们仍然回答它。谢谢。 :) - Lyubomyr Shaydariv
1
自从我回答了这个问题以来,我的一个同事告诉我,最新的Excel可以识别UTF-8 CSV文件,只要它们有一个初始BOM。因此,在未来几年里,当世界上每个人(或者无论是我们交付文件的每个人)都使用那个版本的Excel或更好的版本时,我可能就能够更改我的编码方式了 :-) - Steve Jessop
很奇怪,对我来说它不起作用。把字符变成了中文符号...(它们应该是希伯来语) - Veverke
当我使用“UTF-16 BE with BOM”保存时,Excel 中出现了中文字符。但是当我尝试使用“UTF-16 LE with BOM”时,它可以正常工作!我使用 Sublime Text 进行测试。 - Henno

11

正如我在http://thinkinginsoftware.blogspot.com/2017/12/correctly-generate-csv-that-excel-can.html上发布的:

告诉负责生成CSV的软件开发者进行更正。作为一个快速的解决方法,您可以使用gsed在字符串开头插入UTF-8 BOM:

gsed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' file.csv

如果不存在,此命令将插入UTF-4 BOM。因此,它是幂等命令。现在您应该能够双击该文件并在Excel中打开它。


谢谢,问题已解决。我刚刚在Notepad++中将csv文件的分隔符从';'转换为UTF-BOM,并且现在Excel可以正确打开它了。 - RandomGuy
正是所需!这里有一个在PHP中实现此操作的指针 https://dev59.com/mF8e5IYBdhLWcg3wfafv - EFC
这是针对 Excel 无法识别 CSV 文件中的 UTF 字符的解决方法。因此,这个修正可以解决 Excel 的问题。 - cobp
这适用于带有逗号分隔符的Excel 2007希腊语版本。谢谢。 - NameOfTheRose
在 fs.createWriteStream(fileName,{encoding: 'UTF-16le'}) 中更改编码为 'UTF-16le',然后 Excel 正确打开了 CSV 文件。 - rahul shukla
这绝对是最好的答案。我将我的csv写入std :: ofstream。因此,如果我首先:file << "\xef\xbb\xbf";。然后我可以跟随utf8数据,它在Excel 2007中可以正常打开。谢谢! - lakeweb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接