背景:近来用到了csv 文件来编辑保存文件,然后用自己的程序去读写csv文件, 因此自己写了一个读写csv文件的类,大致遇到如下的一些情况,在此记录下。
问题: 原本想法比较简单,只在csv 里面保存 中文和英文,这时用ANSI 查看一切都没有问题,但是问题来了,后来发现我的 CSV 文件是需要保存很多种语言,像西欧
的一些文字(比如 ååå ),在csv 直接输入保存后打开就变成了 ??? 的乱码了。。。
解决方案: 既然用 ANSI 格式来保存的时候有问题,干脆用Unicode 格式来保存就好了。可以如此操作,打开 ANSI 格式的 CSV 文件,修改后另改为其他格式时选 Unicode Text(*.txt)。。。然后再改文件后缀为.csv。。。 如果是自己写程序则直接用unicode 写文件即可。。。。
注意:
一、 这两种编码格式的分隔是有一定区别的,所以在读写文件是应特别注意。。。。
CSV 的 ANSI 版本,是以 逗号( , )为分隔各个单元格的;
而 Unicode 版本 却是以 制表符 ( \t ) 为分隔的。
二、测试 utf-8 编码的csv 文件,用 文本方式打开,删除所有的内容(即变成一个一行都没有添加的csv文件),保存后再用excel 打开会发现第一格出现"锘“的乱码(实际它就是UTF-8 的前两个标志字节 EFBB )。 为了避免此类问题的发生,在编程时对于一行都没有的csv文件,不妨加上一个回车换行。。这样用excel 打开时就不会出现如此怪异的情况。
=======================================================================================================
以下是一些补充的资料,
ANSI : 无格式定义;
Unicode : 前两个字节为 FFFE ;
Unicode big endian : 前两字节为 FEFF ;
UTF-8 : 前两字节为 EFBB ;
判断 CSV 文件是否为 unicode ,可以用如下代码来判断。。。
<span style="color:#333333;">// Check if it is unicode file
if (!file.eof())
{
char szText[2];
file.read(szText, 2);
if (!file.fail())
{
bUnicode = (0xFF == (BYTE)szText[0] && 0xFE == (BYTE)szText[1]);
}
if (!bUnicode)
{
// reset file position
file.seekg(0, ios_base::beg);
}
}</span>
规则