python显示中文乱码的几种情况encode decode

问题:最近在用vscode进行python编写的代码输除中文的时候出现乱码

一、VSCODE无法显示中文的问题

显示汉字乱码,类似下面这些情况:

str = '中文'
print(str)
print(str.encode('utf-8'))
print(str.encode('gbk'))

输出:
在这里插入图片描述
解决方法:菜单Debug->Open Configurations,打开launch.json
在这里插入图片描述
"env":{ "PYTHONIOENCODING":"gbk" }

二、python中文乱码问题

排除IDE环境影响,而又出现乱码的情况,是因为:
一般情况下window默认编码gbk,linux默认编码utf8。正常我们的输出如下:

#-*-coding:utf-8 -*-
str = '中文'
print(str)
print(str.encode('utf-8'))
print(str.encode('gbk'))

正确输出:
在这里插入图片描述
python编程中:系统编码,python编码,文件编码的概念。
(1)系统编码:默认写源码的编辑器的编码方式。它代表源码文件内的所有内容都是根据词方式编码成二进制码流。存入到磁盘中的。linux下通过locale命令查看。
(2)python编码:指python内设置的解码方式。如果不设定的话,python默认的是ascii解码方式。如果python源代码文件中不出现中文的话,这个地方怎么设定应该不会问题。
设定方法:在源码文件开头(一定是第一行):#--coding:UTF-8--,源码文件的设置解码方式是UTF-8

三、具体分析

一般情况下输出乱码的原因就是没有按照系统解码的方式进行编码。

第一种:读取文件的字符,出现乱码原因:

如果文件内容用utf-8的编码保存的源文件。但是windows的本地默认编码是cp936,也就是gbk编码,所以在控制台直接打印utf-8的字符串当然是乱码了。
解决方法:
在控制台打印的地方用一个转码就ok了,打印的时候这么写:

print(myname.decode('utf-8').encode('gbk'))

第二种:python 使用ctypes调用动态库,输出汉字字符:

dll调用的情况:
比如定义结构体输出结果是char license[PLATE_NAME_MAX];,这时候要显示信息有汉字字符,则要加decode:

print("plate number :", djPDVarOut.license.decode('gbk')) 

再举例来说:
比如print(s), s类型为str,linux系统下系统默认编码为utf8编码,s在输出前就应该编码为utf8。如果s为gbk编码就应该这样输出。print(s.decode(‘gbk’).encode(‘utf8’))才能输出中文。

第三种:就是直接给一个字符型数据,进行decode会报错。

在这里插入图片描述
decode针对的是以下类型的数据(倒数两行),而且一定要有**‘b’**
在这里插入图片描述

如果没有b就会被当做是str,则不能用decode,只能encode

在这里插入图片描述
另外:直接输出也是会出错,不管数据是gbk还是utf-8编码输入
在这里插入图片描述
解决办法:用raw_unicode_escape编码,给带上b符号

str_without_b = '\xe4\xb8\xad\xe6\x96\x87'
str = str_without_b.encode('raw_unicode_escape')
print('raw_unicode_escape 编码后:',str)
print('再用utf-8解码:',str.decode('utf-8'))

第四种:先用gbk编码encode,再用utf-8解码decode,会报错

在这里插入图片描述
因为gbk编码后的格式,无法用utf-8解码,可能越界。(我猜的)

整理的比较乱,最后给出几个参考链接:

https://www.cnblogs.com/dinghanhua/p/9933000.html
https://blog.csdn.net/joyfixing/article/details/79971667
https://blog.csdn.net/frozleaf/article/details/95304096
https://www.cnblogs.com/weixliu/p/3550642.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章