python2 中文 乱码问题

本文详细解析了Python中乱码产生的根本原因,并提供了具体的解决办法。重点在于源文件编码声明和字符串编码设置的一致性,确保所有字符串统一为Unicode编码。
部署运行你感兴趣的模型镜像

乱码产生的原因

乱码产生的根本原因是字节流转换字符前后不一致导致。只要掌握了这个核心,就能解决乱码问题,在java中,由于严格区分了字节流和字符,所以理解起来比较简单。但python2中使用了一些“trick”(没有区分字符和字节流),所以理解起来有些困难。在python中遇到没有指定为unicode的string,就理解为字节流! 字节流,没有编码,只有字节,所以在转换字符时经常会出现乱码。接下来说明乱码的几个点及解决办法。

源文件编码、字符串编码

在python中有2个地方的编码要注意,源文件的编码、字符串的编码,只要设置正确了就不会出现乱码。

源文件编码

在源文件的第一行或者第二行一定要声明文件的编码方式并且与文件编码一致,通常会将源文件保存为utf8,声明也是utf8,如

# coding=utf8

#coding:utf8

如果不指定源码文件编码格式,文件中包含非ascii字符就会出现错误。

SyntaxError: Non-ASCII character ‘\xe4’ in file test_encoding.py on line 3, but
no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

这是因为,如果不指定源文件编码,python解释器会按照默认的字符集ascii来解码文件,由于中文不属于ascii字符集,所以会出错。

这里写图片描述

这里写图片描述

字符串编码

字符串编码分两种情况,
指定了unicode:在字符串前边加u,如u'你好' ,这种情况不会出现乱码;
没指定unicode:普通字符串的写法,如'你好' ,这种情况字符串的编码与源文件编码一致;当字符串编码与控制台编码不一致时,就会出现乱码,这是因为python中的字符串就是字节数组,由于没有声明为unicode,所以按照windows terminal的默认编码gbk来解码(从字节数组转为字符),utf8的字节数组转为gbk的字符,肯定是不兼容的,所以出现了乱码。如

这里写图片描述

这里写图片描述

解决办法很简单,指定为unicode或者使用decode函数将字符串转为unicode编码。如

'你好' #这里没有指定编码,所以就是utf8的字节流,输出到控制台时,转为gbk,因为由utf8字节流--转--->gbk,不兼容,所以,就出现乱码了。
u'你好' #指定字符串为unicode编码
'你好'.decode('utf8')#将utf8的字符串解码为unicode

这里写图片描述

这里写图片描述

因为这里用到了decode函数,所以说一下decode、encode函数

decode(), 解码就是将字节流转为字符,python中特指,其他字符集(比如,utf8、gbk、isoo8859-1)解码为unicode
encode(),编码就是从字符转为字节流,python中特指,unicode编码为其他字符集(比如,utf8、gbk、isoo8859-1)

关于这个知识点可以这样理解,unicode包含世界所有的字符,编码、解码都要围绕unicode来进行,否则由于不兼容就会出错;从unicode到utf8就是编码,从utf8到unicode就是解码;

出现字符串的地方,都指定为unicode编码。

总结

综上所述,最简单的办法就是声明的编码类型与源文件一致出现字符串的地方都指定为unicode编码,能解决99%的乱码问题。python3默认就是unicode,不会出现这些问题了。

参考

pep-0263

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### Anaconda Python 中文乱码解决方案 在使用 Anaconda 的 Python 环境时,如果遇到中文乱码问题,通常可以通过以下方法解决: #### 1. 修改文件编码格式 Python 默认的编码格式是 ASCII,这会导致无法正确输出汉字。为了解决这一问题,可以在 Python 文件的开头添加以下内容以指定 UTF-8 编码[^1]: ```python # -*- coding: UTF-8 -*- ``` 或者: ```python # coding=utf-8 ``` #### 2. 使用最新版本的 Anaconda 较新的 Anaconda 版本对中文编码的支持更好,因此建议下载并安装最新版的 Anaconda (Python 3.x 版本),以减少中文编码报错的可能性[^1]。 #### 3. 配置 Matplotlib 支持中文 如果在使用 Matplotlib 绘图时遇到中文乱码问题,可能是因为 Matplotlib 缺少支持中文的字体库。以下是具体的解决步骤: ##### (1)激活目标环境 确保进入需要使用 Matplotlib 的 Anaconda 环境。例如,如果目标环境名为 `yolov5`,可以执行以下命令激活环境: ```bash conda activate yolov5 ``` ##### (2)查找 Matplotlib 字体配置路径 运行以下代码获取 Matplotlib 的字体配置路径: ```python import matplotlib print(matplotlib.matplotlib_fname()) ``` 假设输出路径为 `/home/user/anaconda3/envs/yolov5/lib/python3.7/site-packages/matplotlib/mpl-data/matplotlibrc`[^2]。 ##### (3)下载并安装中文字体 下载支持中文的字体文件(如 SimHei),并将字体文件拷贝到 Matplotlib 的 TTF 字体目录下。例如: ```bash cp SimHei.ttf /home/user/anaconda3/envs/yolov5/lib/python3.7/site-packages/matplotlib/mpl-data/fonts/ttf/ ``` ##### (4)修改 Matplotlib 参数 在绘图代码中添加以下内容以指定使用中文字体: ```python import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 ``` #### 4. 检查系统字体支持 如果上述方法无效,可以检查系统中是否已安装支持中文的字体。例如,在 Linux 系统中,可以安装 `fonts-wqy-microhei` 或 `fonts-wqy-zenhei` 包[^3]: ```bash sudo apt-get install fonts-wqy-microhei ``` 然后重新配置 Matplotlib 字体路径。 #### 5. 在 macOS 下的特殊处理 在 macOS 下使用 Anaconda 时,如果仍然遇到中文乱码问题,可以通过以下代码检查当前可用字体,并确认是否存在支持中文的字体: ```python import matplotlib.font_manager for font in matplotlib.font_manager.fontManager.ttflist: print(font.name) ``` 如果没有合适的中文字体,可以手动下载并安装支持中文的字体文件[^5]。 --- ### 示例代码 以下是一个完整的示例代码,展示如何在 Anaconda 环境中解决中文乱码问题并绘制包含中文的图表: ```python # -*- coding: UTF-8 -*- import matplotlib.pyplot as plt # 配置中文字体 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 绘制图表 x = [1, 2, 3] y = [4, 5, 6] plt.plot(x, y) plt.title('中文标题') plt.xlabel('横轴标签') plt.ylabel('纵轴标签') plt.show() ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值