【原创】python3读取操作系统设备中文编码问题——encode、decode
pyaudio模块读取设备名称来指定相应的设备进行录音,涉及操作系统编码、IDE解码等问题
一、背景和问题
近期在做一个关于声卡录音的项目,开发环境是win10 64位家庭中文版,pycharm2019.1,python3.6(Anaconda3),python模块pyaudio。因为需要实现内录音(录制系统内部声音,而不是麦克风的声音),因此需要pyaudio模块读取设备名称来指定相应的设备进行录制。问题来了,系统是中文的,设备也有中文字符(“立体声混音”)。试来试去,就是find不到设备,pycharm调试,确实遍历到有好几个设备,但是都是乱码的。问题露出头来了,果然,又是编码的问题。为什么用到果然,因为编码问题之前在做爬虫的时候可困扰了很久,网页爬出来的都是各种二进制流数据。再说了,编码这个即原始又无法回避的问题,坑可不小。
问题:中文乱码、AttributeError: \’str\’ object has no attribute \’decode\’、UnicodeDecodeError: \’utf-8\’ codec can\’t decode byte 0xc9、Beta版:使用Unicode utf-8提供全球语言支持。
二、编码的基础知识
这里来学习下有关编码的一些基本知识。这里要感谢博主joyfixing写的《彻底搞懂 python 中文乱码问题》,来龙去脉写的很详细,而且相当感同身受,这里主要进行引用借鉴。
三、关于乱码
编码encode就是将字符转成二进制流,解码decode就是把二进制流转成各种的字符。在这两个相互转化的过程中,涉及到操作系统、控制台cmd、IDE、文本保存等等,有一环节出现不兼容就会乱码,乱码的形式可谓眼花缭乱,一脸懵逼。(黑人问号脸)可以网上搜索,这里就不阐述了。
四、解决方法
在开发的时候,我把程序的编码设为了utf-8编码格式。通过这样设置。# -*- ecoding: utf-8 -*-
天真的以为应该就可以了吧。发现,没有那么简单。如图,还是一团糟。
于是乎,就开始了两天的网上冲浪,而且是手机设的热点!!!
有人说pycharm设置里要设下文件编码模式,我就照做了。
还是没解决。有人说看下系统默认的编码模式,我就看了下。返回的都是utf-8啊。
还有人说要decode转到中间的Unicode字符集,再encode到utf-8.新的问题来了,再搜索,哦,python3和python2不一样了,3里面不能这么用了。(持续黑人问号脸)
又有人说改成这样,对。在cmd里输入chcp指令查询操作系统编码为936,为gbk。有道理,有些小激动,感觉要出人头地了呢。
新的问题又来了。UnicodeDecodeError: \’utf-8\’ codec can\’t decode byte 0xc9
还有人说加上ignore,把一些没有的字符集给忽略了,还是乱的!!!
后面就各种编码方式(utf-8、gb2312、gbk、gb**、utf-8-sig……),各种encode、decode排列组合了,几乎到了奔溃的边缘。(我是谁?我在哪?我在干什么?)
直到看到有人说更改操作系统的语言设置。
时间和语言-管理语言设置-更改系统区域设置-中文(简体、中国),没错啊!!!我也是这样的啊。重启。好哒,使出我的杀手锏—重启下!!!
稍等片刻,启动pycharm,调试程序……还!是!乱!码!啊!啊!啊!
等下,等下,刚才更改区域语言的时候,下面有一行字是什么来着。Beta版:使用Unicode utf-8提供全球语言支持。
操作系统没有默认的吗???好哒,勾上,重启。期待的大眼睛!!!
天啊,解决了,困扰了两天的问题解决了,真的吗,喜出望外。(我是谁?我在哪?我在干什么?)
五、总结
当然,关于编码问题,还是那句话,即原始,又避不开。这样设置后,可能有一些软件会不兼容的。
我们站在巨人的肩上,享受时光静好的同时,适当了解原理和前辈走过的路。希望代码且调且珍惜,bug渐行渐远。
Ps:
大家在coding的时候,项目文件开始会留下逼格满满的注释,每创建一个就写一次吗?不存在的。
在 File | Settings | Editor | File and Code Templates 设置就可以了。
# -*- ecoding: utf-8 -*-
# @ModuleName: ${NAME}
# @FileName : ${NAME}.py
# @Software : ${PRODUCT_NAME}
# @Function :
# @Author : ***
# @blog : https://www.cnblogs.com/imu-ai/
# @E-mail : ***
# @Time : ${DATE} ${TIME}