是否可以强制Excel自动识别UTF-8 CSV文件?

Lyu*_*riv 412 csv excel utf-8

我正在开发一个应用程序的一部分,负责将一些数据导出到CSV文件中.该应用程序始终使用UTF-8,因为它在各个层面都具有多语言特性.但是在Excel中打开这样的CSV文件(包含例如变音符号,西里尔字母,希腊字母)并没有达到预期的结果?„/?¤, ?–/?¶.而且我不知道如何强制Excel理解打开的CSV文件是用UTF-8编码的.我也尝试过指定UTF-8 BOM EF BB BF,但Excel忽略了这一点.

有没有解决方法?

PS哪些工具可能像Excel一样?


UPDATE

我不得不说,我把社区与问题的表述混为一谈.当我提出这个问题的时候,我想要一种在Excel中打开UTF-8 CSV文件的方法,而不会给用户带来任何问题,而且流畅透明.但是,我使用了错误的配方要求自动执行此操作.这非常令人困惑,它与VBA宏自动化发生冲突.这个问题有两个我最欣赏的答案:Alex /sf/answers/420163691/的第一个答案,我接受了这个答案; 第二个是由Mark /sf/answers/454164931/稍后出现的.从可用性的角度来看,Excel似乎缺乏良好的用户友好型UTF-8 CSV支持,因此我认为这两个答案都是正确的,我首先接受了Alex的答案,因为它确实表明Excel无法做到这是透明的.这就是我在这里自动混淆的.Mark的答案为更高级的用户提供了一种更复杂的方式来实现预期的结果.这两个答案都很棒,但亚历克斯的答案更符合我未明确指出的问题.


更新2

五个月后,在最后一次编辑之后,我注意到Alex的答案因某种原因消失了.我真的希望这不是一个技术问题,我希望现在不再讨论哪个答案更大.所以我接受马克的答案是最好的答案.

小智 377

Alex是正确的,但是因为你必须导出到csv,你可以在打开csv文件时给用户这个建议:

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

这样特殊字符应该正确显示.


Str*_*ior 152

UTF-8字节顺序标记将提示Excel 2007+使用UTF-8.(见这篇SO帖子).

如果有人遇到同样的问题,.NET的UTF8编码类不会在GetBytes()调用中输出字节顺序标记.您需要使用流(或使用变通方法)来输出BOM.

  • 插入UTF-8 BOM似乎是要走的路.之后它是透明的. (13认同)
  • 我使用Notepad ++轻松地将.csv从`UTF-8`转换为带有BOM的UTF-8 (11认同)
  • 是的 - 最佳解决方案.在http响应中设置标题的许多令人困惑的帖子.这解决了这个问题.在记事本中打开文件并使用UTF-8选项向右保存时,可以看到相同的内容.还添加了字节顺序标记. (3认同)
  • @Elmue:我想也许(像我一样)他“认为”他用字节顺序标记保存它,但不是因为某些库没有按照他想象的方式工作。我发现添加这个答案是值得的,显然其他许多人也发现它很有用。无论如何,这似乎是一个比说不使用 CSV 或指导用户如何以某种奇怪的方式打开文件更好的答案。 (2认同)
  • @marsze:感谢您指出这一点。我发布的链接上还有另一个使用流的答案。我想教训是 `GetBytes()` 从来没有打算用来自己生成整个文件的内容:我们应该使用流并让它们调用 `GetPreamble()` 和 `GetBytes()` 并且这样的。 (2认同)
  • @StriplingWarrior 非常正确,BOM *仅*属于流的开头。我喜欢另一个答案的地方(除了它基本上只是另一种编写方式:“string.ToBytes(encoding)”而不是“encoding.ToBytes(string)”)是你可以传递“new UTF8Encoding(true)”或 `new UTF8Encoding(false)` 用于控制是否输出 BOM。 (2认同)

小智 71

忽略BOM的错误似乎是为Excel 2013修复的.我对西里尔字母有同样的问题,但添加BOM字符\uFEFF确实有帮助.

  • 这也解决了我的问题,在php中它看起来像这样:`$ utf8_with_bom = chr(239).chr(187).chr(191).$ csvText`; (14认同)
  • 由于我在CSV文件的开头添加了\ uFEFF(用Java生成),因此Excel能够正确打开它们!谢谢 (8认同)
  • 根据定义,UTF-8 不使用也不应该使用 BOM 字符。Excel 读取 BOM 的方式破坏了 UTF-8 相对于 Unicode 的优势,后者向后兼容 ASCII。添加 BOM 将使 Excel 正常工作,但会破坏其他正确的 UTF-8/ASCII 文件读取。 (2认同)
  • @MarkRansom 但这根本不是 UTF-8 规范。根据定义,UTF-8 应该与二进制级别的标准 ASCII 兼容,这意味着没有超过 127 个字符。下面的所有内容都应该是直接的“标准”,没有特殊字符。如果没有 BOM,微软应该做的是 DEFAULT UTF-8,而不是默认他们的 MS 糟糕的编码。 (2认同)

Elm*_*mue 45

令人难以置信的是,有这么多的答案,但没有人回答这个问题:

"当我问这个问题的时候,我问了一种在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忽略了这一点."

我也有同样的经历:将俄语或希腊语数据写入带有BOM的UTF8 CSV文件,导致Excel中的垃圾:

UTF8 CSV文件的内容:

Colum1;Column2
Val1;Val2
?????????;T??????
Run Code Online (Sandbox Code Playgroud)

Excel 2007中的结果:

CSV UTF8 Excel

解决方案是根本不使用CSV.Microsoft以愚蠢的方式实现此格式,如果使用逗号分号作为分隔符,则依赖于控制面板中的区域设置.因此,同一个CSV文件可能在一台计算机上正确打开,但在另一台计算机上却没有."CSV"表示" 逗号分隔值",但是例如在德语Windows上默认使用分号必须用作分隔符,而逗号不起作用.(此处应将其命名为SSV =分号分隔值)CSV文件不能在不同语言版本的Windows之间互换.这是UTF-8问题的另一个问题.

Excel存在数十年.遗憾的是,这些年来微软无法实现CSV导入这样的基本功能.


但是,如果将相同的值放入HTML文件并将该文件保存为带文件扩展名为XLS的 BOM的UTF8文件,则会得到正确的结果.

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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

此代码甚至允许指定工作表的名称(此处为"MySuperSheet")

Excel 2007中的结果:

在此输入图像描述

  • 由于您花时间指出这里没有其他答案导致Excel正确打开CSV文件,因此值得一提的是,这个答案也没有这样做.最初接受的答案(由主持人删除)建议直接将数据导出到Excel文件,或导出HTML文件并允许用户在Excel中打开文件.这些解决方案中的任何一个都不如使用XLS文件扩展名保存HTML文件,但是没有提出实际回答问题的答案. (8认同)
  • 令人难以置信的是,人们仍然回答这个问题。:) 然而,我认为 CSV 已经死了:CSV 是一种极其简单的纯流格式,而且,当我参与该项目时,我们也大量使用它来进行组件交互。我永远不会使用 HTML 格式,因为它的代表性太强,而且我无法让该项目的用户将数据导出到 HTML,只是为了使其对 Excel 友好。Excel 在 UTF-8 CSV 方面表现不佳,我不知道五年后发生了什么变化。但我想,用逗号、分号和制表符分隔的文件确实很疯狂。 (4认同)
  • 人们仍然回答你的问题并不令人难以置信,因为谷歌将他们带到这里:所有人都有同样的问题:我如何让愚蠢的Excel做我想做的事情?在Google中输入3个单词:"excel csv utf8",您的问题是全球范围内的第一个结果.你写了畅销书! (3认同)
  • @Warrior:"..但是没有提出实际回答这个问题的答案." 这是不正确的.我已经回答了这个问题:至少在Excel 2007中它是不可能的.这是肯定的答案.如果Excel忽略UTF8 BOM并将数据解释为ANSI,则无法通过简单的双击文件(例如"用户没有任何问题")通过CSV将例如希腊语或俄语文本导入Excel ).我建议的是一个工作解决方案,它可以通过双击在所有Excel版本中运行,并且不需要Excel菜单中的其他步骤. (3认同)
  • 这不仅不能回答问题,而且将CSV声明为“旧版”和“失效”是完全错误的。仅仅因为您没有看到它的用途,并不意味着它已经死了。另外,您显然不了解它的历史或今天的用途。这比XML更好(由于较小的数据包大小),并且这里的问题是Microsoft如何根本不遵循UTF8格式的标准。正确的答案是使用开放办公室而不是Microsoft,因为Microsoft从来没有擅长编码。 (2认同)

小智 42

我们使用了这个解决方法:

  1. 将CSV转换为UTF-16
  2. 在文件开头插入BOM
  3. 使用tab作为字段分隔符

  • 您能更准确地解释一下如何转换为 UTF-16 LE 以及使用哪个 BOM 吗? (3认同)
  • 谢谢!我尝试了该线程中的所有其他答案,但转换为 UTF-8 根本不起作用。当我尝试使用 BOM 的 UTF-16 时,它立即生效。 (2认同)
  • 这在Office 2007中不起作用. (2认同)

小智 19

与PHP生成的CSV文件有相同的问题.当在"sep=,\n"内容的开头定义分隔符时(但当然在BOM之后),Excel忽略了BOM .

因此"\xEF\xBB\xBF",在内容的开头添加BOM()并将分号设置为分隔符fputcsv($fh, $data_array, ";");就可以了.


Aki*_*Aki 12

老问题但是,最简单的解决方案是:

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

  • @Veverke如果你定期生成文件,这不是最好的解决方案.但如果它是一次性的,这个答案是完美的.它的工作原理是因为记事本会将BOM放在UTF-8或UTF-16文件的开头. (2认同)

Ste*_*sop 11

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

我没有找到任何方法让Excel自动识别UTF-8,我不愿意/能够对文件的消费者造成如何打开它们的复杂指令.所以我将它们编码为UTF-16le(带有BOM)而不是UTF-8.两倍大小,但Excel可以识别编码.而且它们压缩得很好,所以尺寸很少(但遗憾的是从来没有)很重要.


Nes*_*iza 9

我发布在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
Run Code Online (Sandbox Code Playgroud)

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


小智 6

您可以通过记事本++使用BOM将.csv文件转换为UTF-8:

  1. Notepad ++中打开文件。
  2. 进入菜单EncodingConvert to UTF-8
  3. 进入菜单FileSave
  4. 关闭记事本++。
  5. 在Excel中打开文件。

在Windows 8.1上的Microsoft Office 2013 Plus的Microsoft Excel 2013(15.0.5093.1000)MSO(15.0.5101.1000)中工作,并且将非Unicode程序的区域设置设置为“德语(德国)”。

  • 我必须使用 Encoding -&gt; Cinvert ti UTF-8-BOM Excel version 2016 进行转换 (2认同)

ves*_*ess 6

在 php 中,您只需将 $bom 添加到 $csv_string 之前:

$bom = sprintf( "%c%c%c", 239, 187, 191); // EF BB BF
file_put_contents( $file_name, $bom . $csv_string );
Run Code Online (Sandbox Code Playgroud)

使用 MS Excel 2016、php 7.2.4 进行测试


Chr*_*oph 5

一个真正令人惊叹的答案列表,但由于仍然缺少一个相当好的答案,我将在这里提到它:用谷歌表格打开 csv 文件打开 csv 文件并将其作为 excel 文件保存回本地计算机。

与 Microsoft 不同的是,Google 已成功支持 UTF-8 csv 文件,因此只需在其中打开该文件即可。并且导出为 Excel 格式也可以。因此,尽管这可能不是所有人的首选解决方案,但它非常安全,而且点击次数并不像听起来那么高,尤其是当您已经登录谷歌时。