mac下CSV文件用FileReader、FileWriter读写乱码
在win下,excel采用GBK编码,1个汉字是存为2个字节,而mac下各种软件广泛默认使用UTF-8编码方式,如在excel中,1个汉字存为3个字节,所以mac下用excel解码二进制时,也就是把二进制文件解码为汉字过程中,把原本相邻2个字节认为是一个汉字,现在拆解为把相邻3个字节才认为是一个汉字。你设想,假如源文件只有3个汉字是6个字节,来到mac下,6个字节才等于2个汉字大小,整个文件肯定都读不出原来语义了,细心的你还会发现乱码部分变少了。这每3个字节在UTF-8码表上对应什么码值就显示什么码值,如果没有对应码值,会以特殊字符代替,这些都叫“乱码”。简单来说,就是用GBK编码,打开浏览却用UTF-8解码导致的。
在说测试代码前,我先普及下,mac下MyEclipse默认也是UTF-8,在preference--general--workspace里可以查看和更改。我们在用IO流的各种方法,比如测试代码里的String(byte[] bytes, int offset, int length) 和FileWriter.write(),查看他们的文档注释时,大都提到采用平台默认编码方式,就是指这里的编码方式。
但不论你的MyEclipse是设置为GBK还是UTF-8,运行代码你会发现,1个相同点和1个不同点。
相同点是生成的22.csv文件里都是乱码。当用GBK时,FileReader读的是对的,都把2个字节认为1个汉字。你取消注释,能打印出来中文就能验证我说的对,FileWriter写也是对的,也是把2个字节认为1个汉字,至于生成的22.csv显示乱码,是因为mac下excel用UTF-8解码的缘故。正因为FileReader、FileWriter都用GBK读写而excel用UTF-8解码,所以22.csv和11.csv乱码显示是一样的。
不同点是,用UTF-8时,生成的22.csv显示的乱码跟GBK下显示的乱码不同,因为读写都按3个字节处理。原理同上。理解了,你也能知道,即使有把22.csv重新用UTF-8存储的功能,也找不回原来的文字,因为从最开始再windows我们给excel输入中文保存时,就默认选择了1个汉字按2个字节存储的GBK编码方式。(难怪我在mac的excel下没发现选择存储编码方式)
如何避免呢,在win下就该存一份UTF-8格式的文件再拷贝到mac。因为只有在最开始写好中文保存的时候,就决定了汉字按2个字节存储还是3个字节存储。当然MAC也有相应的转换工具iconv,但我使用发现文件预览是正确汉字,打开还是乱码,但起码能看到汉字,说明iconv是没问题的,可能是excel版本兼容问题,我的是最新的mac版本office365。
mac下CSV文件用FileReader、FileWriter读写乱码的更多相关文章
- java FileReader/FileWriter读写文件
java FileReader/FileWriter读写字母和数字没问题,但读写汉字就乱码.记录下,后面找到解决方法再补上. public static void main(String[] args ...
- MAC下 mysql不能插入中文和中文乱码的问题总结
MAC下 mysql不能插入中文和中文乱码的问题总结 前言 本文中所提到的问题解决方案,都是基于mac环境下的,但其他环境,比如windows应该也适用. 问题描述 本文解决下边两个问题: 往mysq ...
- 10.3 io流 正篇 FileReader FileWriter读写代码
一.FileWriter 小节: 1)FileWriter fw = new FileWriter("a.txt",true);//表示追加写入,默认是false.正常情况:执行多 ...
- Mac下DIY文件浏览器
2015-07-14 15:07:53 Mac下的finder不能浏览Linux文件目录, 一些优秀的资源管理器是收费的..... 于是想到了既然Mac的本质是类Unix, 而在windows下查看L ...
- Mac下hosts文件配置
工作中总会因为莫名其妙的原因,比如Mac下面打不开某网站,但是在windows 7下面却可以,此时只需两步即可完成在Mac下面上网.在Windows下面Win+R,输入cmd,进入命令行,将在wind ...
- mac下执行文件出现Permission Denied的解决
mac 下终端访问文件出现“Permission Denied”解决方案: 一个文件有3种权限,读.写.可执行,你这个文件没有可执行权限,需要加上可执行权限. 1. 终端下先 cd到该文件的目录下 2 ...
- excel for mac打开csv文件不分列
参考链接:http://www.1207.me/archives/247.html excel for mac在打开csv文件(逗号分隔的文本文件)的时候,不能像windows那样分列,而且全都挤在一 ...
- Mac下将文件复制到移动硬盘
在Mac下将移动硬盘格式化成exfat,这样Mac和Windows都可以对移动硬盘进行识别
- MySQL直接导出CSV文件,并解决中文乱码的问题
需求: 需要导出hr_users 表中的部分字段的数据,以前是用PHP写脚本,然后导出CSV文件. 在MySQL中,它自己就能导出CSV文件 ,只不过是有如下几个问题需要大家解决. 1. 生成文件不成 ...
随机推荐
- 解决clipboard手机端无法复制的一种思路
最近,做了一个切图的小项目 主要内容是微信号的推广页面,上面会有精美的图片和微信号:) 点击按钮,会复制到粘贴板上,自己去微信里面粘贴搜索:),懒人会进行一系列复杂操作么,不看好 首先,百度了一下,看 ...
- DTD验证XML文档
DTD验证XML文档 1.DTD简介:DTD是Document Type Definition的缩写,即文档定义 1.1:DTD的内容包含: ...
- 9 个用于移动APP开发的顶级 JavaScript 框架
顶级 Java 框架 对于Web开发而言,Java是一个有前途的编程语言,并且在不久的将来它将依然在这个领域大放光彩.Java在移动app开发上也有同样的影响吗?让我们一起来看看ValueCoders ...
- 强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning)
强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning) 学习笔记: Reinforcement Learning: An Introductio ...
- solr笔记之solr下载及安装
在学习solr过程中,磕磕碰碰,遇到过许多问题,所以特写下笔记,以供需要的时候时常翻阅,也给能看到该博文的博友提供一个不全面的参考. 一.solr简介: Solr是一个独立的企业及搜索应用服务器,它对 ...
- JS判断手机当前的系统类型
<script language="javascript"> window.onload = function () { var n = navigator.userA ...
- .NET MD5加密解密代码
MD5简介: 是让大容量信息在用数字签名软件签署私人密匙前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数).不管是MD2.MD4还是MD5,它们都需要获 ...
- UINavigationBar统一修改导航条样式
#pragma mark -- 统一导航条样式 //统一导航条样式 UIFont *font = [UIFont systemFontOfSize:19.f]; NSDictionary *textA ...
- wxpython tab切换页面
最近没事学习下wxpython,发现很少有关于页面切换的demo,这边分享下2中切换的方法.第一种:利用wx.Notebook第二种:利用Sizer布局实现(自己写的),代码没有涉及到什么重构之类的优 ...
- 读书笔记 effective c++ Item 32 确保public继承建立“is-a”模型
1. 何为public继承的”is-a”关系 在C++面向对象准则中最重要的准则是:public继承意味着“is-a”.记住这个准则. 如果你实现一个类D(derived)public继承自类B(ba ...