美文网首页
程序保存csv,Excel打开中文乱码,最佳实践flutter

程序保存csv,Excel打开中文乱码,最佳实践flutter

作者: 朱允见 | 来源:发表于2023-09-06 12:39 被阅读0次

    手动操作 非程序员方法(可行)

    程序写入为csv文件,而使用Excel工具打开该文件时,可能出现中文乱码的情况。csv文件使用了UTF-8编码格式,而Excel是以ANSI格式打开的,没有做编码识别。针对此问题有以下解决方案:

    • 使用记事本等文本编译器直接打开,或使用WPS打开;
    • 打开csv文件时,对Excel进行如下设置:
      1. 新建Excel。

      2. 选择“数据 > 自文本”。

      3. 选择导出的监控数据csv文件,单击“导入”。

        进入“文本导入向导”。

      4. 选择“分隔符号”,单击“下一步”。

      5. 去勾选“Tab键”,勾选“逗号”,单击“下一步”。

      6. 单击“完成”。

      7. 在“导入数据”对话框里,单击“确定”。

    程序员的解决方案-探索本质

    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

    在Flutter 中最佳实践,采用添加BOM

     final file = File(dataPath);
      var sink = file.openWrite(mode: FileMode.write);
      sink.write('\uFEFF'); 
      sink.close();
    

    相关文章

      网友评论

          本文标题:程序保存csv,Excel打开中文乱码,最佳实践flutter

          本文链接:https://www.haomeiwen.com/subject/aspkvdtx.html