系统管理功能中,很多时候需要导入导出数据,基本上采用的也都是CSV文件的形式(Excel读入还是比较麻烦)。由于字符集的问题,大部分都采用UTF-8编码。

CSV文件的默认打开方式是Excel,但双击UTF-8编码的CSV文件时,Excel是不能正常显示数据的,会乱码。这是做管理页面一个很常见的问题。
原因:
Excel本身是对应了UTF-8编码的,但当CSV文件是UTF-8编码时,原封不动的双击打开CSV文件时,Excel是无法识别为UTF-8的,而是按照系统默认字符ANSI(简体中文GB2312、日文Shift_JIS)来处理的就乱码了。所以根本原因是Excel字符集识别的问题。

[img]http://dl2.iteye.com/upload/attachment/0121/0921/17266a0b-ea0c-3deb-a031-50ed42701ad7.png[/img]
[img]http://dl2.iteye.com/upload/attachment/0121/0923/5c0e15e0-ff92-3d60-a0b1-108ddda5e254.png[/img]

三种方法:

(1)把CSV文件的编码变换为系统字符集(UTF-8 -> GB2312/Shift_JIS)

这是最简单的方法。大部分文本编辑器都有“另存为”功能,保存时选择字符集。

问题:编码变换后,会有一些特殊字符无法支持。

(2)通过Excel读入外部数据

不需要改变编码,启动Excel,数据->自文本,选择 CSV 文件。
出现文本导入向导,选择 65001 : Unicode (UTF-8)、分隔符号选择逗号后导入数据即可。但每次导入比较麻烦。

问题:不支持换行的数据。

(3)采用UTF-8带BOM的编码

上边两种方法都不是根本的解决方法,都需要用户自己处理CSV文件,所以根本问题还是如何让Excel识别UTF-8编码。
方法是通过添加BOM可以使Excel识别文件为UTF-8编码。

BOM:Byte-Order Mark
https://en.wikipedia.org/wiki/Byte_order_mark

带BOM的文件会比不带BOM的文件多出3个字节,这三个字节是固定的:0xEF 0xBB 0xBF,其Unicode为\uFEFF。
[img]http://dl2.iteye.com/upload/attachment/0121/0925/751a4d48-ce13-3fa4-b027-c922d50ceb49.png[/img]
[img]http://dl2.iteye.com/upload/attachment/0121/0927/cbc1f872-defe-3fbf-acf9-a2613894265e.png[/img]

FileOutputStream fos = new FileOutputStream("D:\\Test1.csv");  fos.write( 0xef );fos.write( 0xbb );fos.write( 0xbf );BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( fos, "UTF8" ));bw.write("a,b,c,d\r\n");bw.close();fos.close();

[img]http://dl2.iteye.com/upload/attachment/0121/0929/e2ffc038-c270-3c9d-9138-217e5f5bf1e9.png[/img]

也可以通过65279实现。

FileOutputStream fos = new FileOutputStream("D:\\Test2.csv");PrintWriter pw = new PrintWriter(new OutputStreamWriter(fos, "UTF8"), true);pw.print((char)65279);pw.print("e,f,g,h\r\n");pw.flush();pw.close();fos.close();

[img]http://dl2.iteye.com/upload/attachment/0121/0931/43061f54-6d29-3390-8e7a-acb9c90888cb.png[/img]

这种方法能够避免变换编码引起的特殊字符不支持,也不需要很麻烦的导入数据,也可以对应改行数据。当然通过大部分文本编辑器也可以为UTF-8文件添加BOM。

问题:
处理CSV文件是要特殊处理文件的前三个字节。
Linux不支持BOM
Excel 2007需要安装sp3才支持

http://stackoverflow.com/questions/6002256/is-it-possible-to-force-excel-recognize-utf-8-csv-files-automatically
http://stackoverflow.com/questions/155097/microsoft-excel-mangles-diacritics-in-csv-files/9337150#9337150

Excel打开CSV文件乱码的问题相关推荐

  1. Excel 打开 CSV 文件乱码解决方法

    Excel 打开 CSV 文件乱码解决方法 - 膨胀的面包 https://blog.wangtwothree.com/code/157.html 经常接触数据的朋友,可能时不时会遇到这种情况,一份 ...

  2. excel打开csv文件乱码解决办法

    参考链接: https://jingyan.baidu.com/article/4dc408484776fbc8d846f168.html 问题:用 Excel 打开 csv 文件,确认有乱码的问题. ...

  3. Excel打开csv文件乱码问题的解决办法

    产生背景 今天在用excel打开一个脚本生成的csv文件(存储编码格式为utf-8)时出现了乱码情况,但是用WPS直接打开却正常显示.因为文件是要交给客户的,office又是普遍使用的一枚办公软件,总 ...

  4. 解决Excel打开csv文件乱码的问题

    当我们用Excel打开csv文件时,有时出现乱码的问题,如下: 出现乱码的原因: 在简体中文环境下,EXCEL打开的CSV文件默认是ANSI编码,如果CSV文件的编码方式为utf-8.Unicode等 ...

  5. EXCEL打开CSV文件乱码的解决方法

    用C#程序通过StreamWriter导出字符串,导出生成txt文本文件,用记事本打开正常,改成csv格式,用excel打开乱码,且不能正确识别分列. 后用记事本打开,把编码从utf-8改成ansi之 ...

  6. 微软excel打开csv文件乱码,wps和txt不乱码,java后台解决

    /*** 下载CSV文件*/@RequestMapping(value = "/dlcsv/{jobLogId}", method = RequestMethod.POST)@Re ...

  7. csv文件导入后台乱码_教师使用Excel打开csv文件出现乱码怎么办-Leo老师

    在工作学习中,我们经常会遇到教师使用Excel打开csv文件出现乱码怎么办这样的问题.夏普说过:不经巨大的困难,不会有伟大的事业.因此,面对教师使用Excel打开csv文件出现乱码怎么办我们应该有努力 ...

  8. excel 打开csv中文乱码

    excel 打开csv中文乱码 背景 用linux跑数据,拉取csv文件,下载到本地windows,然后用excel发现中文乱码了 解决办法 在linux中更改文件编码,两种方式 第一种,在打开的时候 ...

  9. excel打开csv 出现乱码怎么解决 逗号分隔

    excel打开csv 出现乱码怎么解决 https://jingyan.baidu.com/article/ac6a9a5e4c681b2b653eacf1.html CSV是逗号分隔值的英文缩写,通 ...

最新文章

  1. MySQL , MHA , Haproxy 配置
  2. A simple Test Client built on top of ASP.NET Web API Help Page
  3. oracle 管道化表函数(Pipelined Table) [转]
  4. sublime编辑器中文乱码的问题
  5. python--thread多线程总结
  6. O太多,具体都代表什么呢?
  7. java 填充字符串_如何用Java填充字符串?
  8. 网络知识:秒懂你家的网络连接方式
  9. (46)System Verilog数组查找最大最小值
  10. AWS推出OpenJDK长期支持版本Amazon Corretto
  11. nginx 1.8.0下载
  12. 打造自己的U盘工具箱
  13. 安卓版 网易云音乐 6.4.3
  14. 001:InVEST学习——产水/水源涵养
  15. MJKDZ PS2手柄(BK2461):驱动安装问题及解决
  16. 将图片放大如何保持图片的清晰度?
  17. python 描述性分析_python数据分析:美国巴尔的摩16年公务员工资数据集描述性分析...
  18. 定值保险计算举例_保险学计算题
  19. 【C/C++】ifndef/define/endif的作用
  20. JAVA中怎样把用户输入的字符串存入数组中?

热门文章

  1. dell服务器启动顺序如何设置_戴尔品牌机怎么设置启动顺序(按F12进bios的)?
  2. 钛空舱模特队少女节高甜送祝福,助你永远18岁~看到流泪~
  3. 大龄程序员~聊聊我毕业十年的生活,kotlin入门书籍
  4. 云计算推动下一代IDC行业发展
  5. maven项目 导oracle驱动包错误,Missing artifact com.oracle,cannot be read or is not a valid ZIP file
  6. 个人为什么无法上架安卓 App 到国内应用商店?
  7. 工商银行软件测试面试流程,中国工商银行测试工程师笔试题.doc
  8. salt 服务器信息收集,使用saltstack自定义模块获取服务器的信息
  9. Swift之Umbrella header .h not found
  10. GeoServer中WMS、WFS的请求规范 (转)