我正在开发一个应用程序的一部分,负责将一些数据导出到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文件时给用户这个建议:
这样特殊字符应该正确显示.
Str*_*ior 152
UTF-8字节顺序标记将提示Excel 2007+使用UTF-8.(见这篇SO帖子).
如果有人遇到同样的问题,.NET的UTF8编码类不会在GetBytes()调用中输出字节顺序标记.您需要使用流(或使用变通方法)来输出BOM.
小智 71
忽略BOM的错误似乎是为Excel 2013修复的.我对西里尔字母有同样的问题,但添加BOM字符\uFEFF确实有帮助.
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.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中的结果:
您甚至可以使用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中的结果:
在这种情况下,只有表本身有黑色边框和线条.如果您希望所有单元格都显示网格线,则在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中的结果:
小智 42
我们使用了这个解决方法:
小智 19
与PHP生成的CSV文件有相同的问题.当在"sep=,\n"内容的开头定义分隔符时(但当然在BOM之后),Excel忽略了BOM .
因此"\xEF\xBB\xBF",在内容的开头添加BOM()并将分号设置为分隔符fputcsv($fh, $data_array, ";");就可以了.
Aki*_*Aki 12
老问题但是,最简单的解决方案是:
Ste*_*sop 11
我以前遇到过同样的问题(如何生成Excel可以读取的文件,其他工具也可以读取).我使用的是TSV而不是CSV,但编码的问题也出现了.
我没有找到任何方法让Excel自动识别UTF-8,我不愿意/能够对文件的消费者造成如何打开它们的复杂指令.所以我将它们编码为UTF-16le(带有BOM)而不是UTF-8.两倍大小,但Excel可以识别编码.而且它们压缩得很好,所以尺寸很少(但遗憾的是从来没有)很重要.
我发布在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:
Encoding?Convert to UTF-8。File?Save。在Windows 8.1上的Microsoft Office 2013 Plus的Microsoft Excel 2013(15.0.5093.1000)MSO(15.0.5101.1000)中工作,并且将非Unicode程序的区域设置设置为“德语(德国)”。
在 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 进行测试
一个真正令人惊叹的答案列表,但由于仍然缺少一个相当好的答案,我将在这里提到它:用谷歌表格打开 csv 文件打开 csv 文件并将其作为 excel 文件保存回本地计算机。
与 Microsoft 不同的是,Google 已成功支持 UTF-8 csv 文件,因此只需在其中打开该文件即可。并且导出为 Excel 格式也可以。因此,尽管这可能不是所有人的首选解决方案,但它非常安全,而且点击次数并不像听起来那么高,尤其是当您已经登录谷歌时。
| 归档时间: |
|
| 查看次数: |
462928 次 |
| 最近记录: |