专栏首页Python七号遇到乱码问题,如何解决?

遇到乱码问题,如何解决?

完美的世界是没有乱码的,但是我们的世界是不完美的,乱码问题,你总有一天会遇到。

之前解决了一个 Python 的 UnicodeEncodeError 问题,比较具有代表性,特此分享一下,希望可以帮到遇到此类问题的朋友。

通常情况下,Linux 默认使用的字符编码是 utf-8,windows 是 gbk,不跨操作系统的情况下,我们按此编码存取数据,文件和文件名均不会出现乱码问题。

但现实就是要跨系统传输文件。如果文件名都是英文,也不会出现乱码问题,因为英文都是 ascii 编码,而所有的编码都是包含 ascii 码的,谁让人家先发明了计算机呢。

然而,现实就是需要跨系统传输中文名称的文件。

修改文件名的编码

乱码的原因就是编码不一样,比如说 Linux 一个中文名称的文件,“中文.txt",实际上保存在磁盘上时,对其做了 utf-8 的编码,实际保存的就是字节:"中文.txt".encode('utf-8'),这段字节传输到 Windows 机器上时不会改变,当你打开目录查看时,Windows 会按照 gbk 进行解码,就是 "中文.txt".encode('utf-8').decode('gbk'),编码和解码用到的字符集不一样,自然会乱码。

解决办法就是保存文件时,修改文件名的编码,怎么修改?

先来看下 Python 内建的 open 函数签名:

这里的 encoding 参数是指定文件内容的字符编码,而不是文件名的编码,因此我们需要关注 file 这个参数,file 是一个像路径一样的对象,点击 path-like object 可以看到说明:

也就是说,file 可以是一个字符串,也可以是字节串,那就好办了,假如要在 Linux 环境保存一个文件名是 gbk 编码的文件,可以这样做:

file_name = "中文.txt"

with open(file_name.encode('gbk'), "w",encoding = 'your file content encoding') as write:
    # do something

这个文件在 Linux 下的文件名看起来是乱码,但传输到 Windows 就是正常显示的。

ftplib 传输的编码问题

我在数仓做数据交换的时候,通常要 Linux 和 Windows 互相传文件,为此专门写过一个通用的传输文件库 transferfile[1],就遇到了两个编码问题:

1、Linux 向 Windows 传输的文件中文乱码。

解决方法:ftplib 考虑到了这一点,在 ftplib.FTP 初始化后可以传入 encoding 参数,来指定目标系统以何种编码保存文件名称。如下图所示:

2、Windows 下有乱码路径时无法在 Windows 里面递归的创建目标路径。

传输文件时可以指定目标路径,路径不存在时需要递归创建,以便存放上传的文件,ftplib 本身只能创建一个目录,需要自行写递归创建,那么创建之前就要先判断目录是否存在,这就需要用到 ftp.retrlines('LIST'),能列出来的就是存在的。

如果目录内没有乱码文件,也不会有问题,有就会报 UnicodeEncodeError,如下图:

怎么解决呢?

那就是不能让乱码目录影响了我们的主程序,在读取列表时遇到乱码忽略即可,按照 traceback 修改标准库 ftplib 文件 471 行,传入参数 errors='ignore' 如下图所示

标准库为什么不直接加上呢?我猜测就是为了让你知道,这里存在乱码,要忽略的话,自己搞定,我不为你背锅,😄。

最后

本文介绍了乱码问题的原因,如何修改文件名称的编码,用 ftplib 遇到的编码问题如何解决,虽然场景具体,但解决的乱码问题的思路都是一样的,那就是让编码解码使用的字符编码保持一致,如果乱码不影响可以忽略掉不能解码的数据。

如果想了解字符串编码的底层知识,推荐阅读前文Python 基础系列--字符串与编码 的第二节「二、字符串编码」

感谢阅读。又来求关注了,如果觉得内容还不错,请关注或在看分享给你的朋友们,感谢支持。

参考资料

[1]

transferfile: https://pypi.org/project/transferfile/

本文分享自微信公众号 - Python七号(PythonSeven),作者:somenzz

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-09-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 老是遇到乱码问题:它是如何产生的,又如何解决呢?

    中文乱码问题在我们日常开发中司空见惯,那么乱码问题是如何产生的呢?又怎样去解决乱码问题呢?本文将结合基本概念和例子展开阐述,希望大家有收获。

    捡田螺的小男孩
  • Jsp开发中遇到的中文乱码问题及解决方法

    Jsp开发中遇到的中文乱码问题及解决方法 对于程序员来说,乱码问题真的很头疼,下面列举几种常见的乱码供大家学习参考。  1.数据库编码不一致导致乱码   解...

    用户1289394
  • PIL遇到问题解决

    PIL 全称:Pillow 在使用PIL4.2.1版本读取jpeg文件时,报cannot identify image file,去github源查找原因:ht...

    Gxjun
  • python3 解码base64遇到的问题与解决

    错误代码:binascii.Error: Incorrect padding 解决方法 在解码前使用这个方法 if len(message) % 4: ...

    98k
  • JSP开发过程遇到的中文乱码问题及解决方法

    JSP开发过程遇到的中文乱码问题及解决方法 1.数据库编码不一致导致乱码 解决方法: 首先查看数据库编码,输入: show variables like "%c...

    用户1289394
  • 当我们遇到问题的时候改如何解决

    问题 在Openlayer3中直接加载PNG图片,在API中提供了ImageStatic可以将图片展示出来,但是如何设置图片的imageExtent让图片能...

    lzugis
  • 解决网页乱码问题

    我们在创建Servlet时会覆盖service()方法或doGet()/doPost(),这些方法都有两个参数:代表请求的request和代表响应的respon...

    阿Q说代码
  • 遇到中文传参乱码的情况,究竟应该如何解决?

    前端对于url传参的方式,用encodeURIComponent("中文参数"),对url的参数的参数值部分进行编码(有些浏览器会自动对中文进行编码,但是我们加...

    程序员一一涤生
  • Java|如何解决IDEA中控制台中文乱码问题

    当项目运行时发现控制台的中文乱码了,变成了不认识的字体,对于阅读控制台反馈的问题造成了极大的困难。于是首先就想到了是编码格式不对,但是该怎么解决呢?

    算法与编程之美
  • python dict乱码如何解决

    问题: Python中的列表(list)或字典包含中文字符串,直接使用print会出现以下的结果:

    砸漏
  • MySQL之乱码问题解决详解

    今天在写一个项目的时候,在数据库中手动插入数据不会产生中文乱码,但是通过javaWeb却出现乱码,把提交表单和响应中的乱码问题解决后,还是乱码。所以我锁定一定是...

    用户1195962
  • plsql查询乱码问题解决

     步骤一:新建变量,设置变量名:NLS_LANG,变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK,确定即可;  步骤二: 退出pls...

    Java中文社群-磊哥
  • Springmvc解决中文乱码问题

    爱撒谎的男孩
  • Mysql中文乱码问题解决

    Java学习123
  • Linux乱码问题解决方案

    linux系统中文件名内容为urf8编码, windows系统中文件名默认为gbk编码, 多数文档使用gbk编码,系统采用utf8编码 无中文输入法导致的乱码 ...

    用户1221057
  • Springmvc解决中文乱码问题

    爱撒谎的男孩
  • JNI--解决中文乱码问题

    aruba
  • 解决URL中文乱码问题

    周希
  • 如何解决使用JSON.stringify时遇到的循环引用问题

    程序员在日常做TypeScript/JavaScript开发时,经常需要将复杂的JavaScript对象通过JSON.stringify序列化成json字符串,...

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券