python printf中文乱码
目录
- 编码方式
- Ascii
- Unicode
- utf-8
- gbk
- 总结
- 使用方式
- 编码对象转换的基本逻辑
- Ascii & Unicode & utf-8 & gbk
- Reference
在使用python开发上位机软件的时候,发现ARM发送的printf语句,只要打印中文,上位机软件就是乱码显示,仔细研究了一下相关资料,解决了该问题,这里和大家一起分享一下经验~
编码方式
在python中最常见的编码方式有四种,分别是ascii, unicode, utf8和gbk。
Ascii
ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 -1 = 255,所以,ASCII码最多只能表示 255 个符号。
Unicode
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。Unicode规定所有字符和符号最少使用2字节(16 bites)来表示。
utf-8
UTF-8,是对Unicode编码的压缩和优化,他不再使用最少使用2个字节,而是将所有的字符和符号进行分类:ascii码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存。
gbk
gbk,也是基于Unicode编码的进一步优化,其文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示。
总结
在这里可以将这四种编码方式的特点放在如下表格里进行总结和比较:
使用方式
编码对象转换的基本逻辑
在计算机内存中,统一使用Unicode编码,Python的字符串类型是str,一个字符对应若干个字节。当需要保存到硬盘或者需要COM传输的时候,就转换为UTF-8或GBK编码(bytes),可以节省空间。这个时候就需要把str变为以字节为单位的bytes。
因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode 编码(encode)成另一种编码。
Ascii & Unicode & utf-8 & gbk
• 在python2默认编码是ASCII, python3里默认是utf-8。如果在py2文件中有中文时,ascii码将无法表示。因此,在.py 文件中,应该在文件开头以注释的方式明确告诉python解释器,用什么编码来执行源代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
• 在python3中, python解释器默认以Unicode对内容进行编码,所以不需指定编码格式即可表示中文。
2.3 Python 转化命令
# 满洲里国峰电子科技 www.guofengdianzi.com
# weixin: guofengdianzi
From Unicode to utf-8 and from utf-8 to Unicode
example_utf8 = example_str.encode("utf-8")
example_str_return_from_utf8 = example_utf8.decode("utf-8")
From Unicode to gbk and from gbk to unicode
example_gbk = example_str.encode("gbk")
example_str_return_from_gbk = example_gbk.decode("gbk")
From gbk to utf-8 and from utf-8 to gbk
example_str_return_from_gbk = example_gbk.decode("gbk") example_utf8_return_from_gbk = example_str_return_from_gbk.encode("utf-8")
example_str_return_from_utf8 = example_utf8.decode("utf-8") example_gbk_return_from_utf8 = example_str_return_from_utf8.encode("gbk")
From unicode to assic and from assic to unicode
example_ascii = ord(example_str)
example_str_return = chr(example_ascii)
2.4 举例
在这里我们以中文“发送成功”为例,来看看这几种编码方式在python中的表现。
作者:潇洒的电磁波(专业:射频芯片设计、雷达系统、嵌入式。欢迎大家项目合作交流。)
Reference
[1] https://blog.csdn.net/weixin_30294295/article/details/98390432?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-3-98390432-blog-122048843.pc_relevant_3mothn_strategy_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-3-98390432-blog-122048843.pc_relevant_3mothn_strategy_recovery&utm_relevant_index=6
[2] • https://blog.csdn.net/weixin_36005427/article/details/112934602?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-4-112934602-blog-122048843.pc_relevant_3mothn_strategy_recovery&spm=1001.2101.3001.4242.3&utm_rel