问题:最近在用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