Python\C++在linux和mac读写.csv正常和Windows乱码的解决方法

背景:

在linux下开发的python\C++读写.csv的脚本可以正常运行,给产品到windows下就各种问题。。。

Python部分

问题1:gbk codec can't decode byte Oxae in position 74: illegalmultibyte sequence

原因:

此种错误,可能是要处理的字符串本身不是gbk编码,但是在windows中却以gbk编码去解码 。比如,字符串本身是utf-8的,但是却用gbk去解码utf-8的字符串,所以结果出错。 

解决方法:

在读文件前,先读取文件前4位(编码位),确认好encoding的编码格式,在以该种编码格式打开文件即可

def check_charset(file_path):
    with open(file_path, "rb") as f:
        data = f.read(4)
        charset = chardet.detect(data)["encoding"]
    return charset

file_dir = "/data/test.csv"
with open(file_dir, "r",
     encoding=check_charset(file_dir)) as accuracy_file:
     pass

问题2:.csv文件在linux和Mac中正常,在windows下中文乱码

原因:

BOM(byte-order mark,字节顺序标记):
Unix系统中都是使用的utf-8编码,所以在Mac用open打开utf-8编码的csv文件并不用加encoding=“utf-8”。

Windows系统的中文环境很多软件默认字符编码为gbk,比如如果用上面的语句打开csv文件则会报错。

具体原因比较麻烦。。。要下班回去了,有机会再解释。。。

解决方法:

有两种方法,最好一起用

一、手动写BOM在要写的文件前面

def add_bom_for_windows(file):
    with open(file, "wb") as f:
        f.write(codecs.BOM_UTF8)

 二、加encoding="utf-8-sig"

add_bom_for_windows(out_dir4)
with open(out_dir4, "a", encoding="utf-8-sig") as o:
    for line in lines:
        o.write(line)

C++部分

在文件头同样加入BOM字段即可

char szUTF_8BOM[4] = {char(0xEF), char(0xBB), char(0xBF), char(0)};
std::ofstream f(not_select_as_true_file, ios::out);
f << szUTF_8BOM;

参考:

Python中读取txt文本出现“ 'gbk' codec can't decode byte 0xbf in position 2: illegal multibyte sequence”的解决办法_云水禅心的博客-CSDN博客

「Python数据分析」CSV读取与写入的常见问题(空行、BOM、r/w/a模式、指针)_Parzival_的博客-CSDN博客Python写入的CSV在Windows中乱码_ITROOKIEIS的博客-CSDN博客「Python数据分析」CSV读取与写入的常见问题(空行、BOM、r/w/a模式、指针)_Parzival_的博客-CSDN博客C++ 输出文字到csv文件 乱码问题_小飞1116的博客-CSDN博客

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文锦渡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值