【原创】python3读取操作系统设备中文编码问题——encode、decode

        一、背景和问题

        近期在做一个关于声卡录音的项目,开发环境是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、文本保存等等,有一环节出现不兼容就会乱码,乱码的形式可谓眼花缭乱,一脸懵逼。(黑人问号脸)可以网上搜索,这里就不阐述了。【原创】python3读取操作系统设备中文编码问题——encode、decode_第1张图片

        四、解决方法

        在开发的时候,我把程序的编码设为了utf-8编码格式。通过这样设置。# -*- ecoding: utf-8 -*-

        天真的以为应该就可以了吧。发现,没有那么简单。如图,还是一团糟。

【原创】python3读取操作系统设备中文编码问题——encode、decode_第2张图片

        于是乎,就开始了两天的网上冲浪,而且是手机设的热点!!!

        有人说pycharm设置里要设下文件编码模式,我就照做了。

【原创】python3读取操作系统设备中文编码问题——encode、decode_第3张图片

        还是没解决。有人说看下系统默认的编码模式,我就看了下。返回的都是utf-8啊。

        还有人说要decode转到中间的Unicode字符集,再encode到utf-8.新的问题来了,再搜索,哦,python3和python2不一样了,3里面不能这么用了。(持续黑人问号脸)【原创】python3读取操作系统设备中文编码问题——encode、decode_第4张图片

        又有人说改成这样,对。在cmd里输入chcp指令查询操作系统编码为936,为gbk。有道理,有些小激动,感觉要出人头地了呢。

        新的问题又来了。UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc9

        还有人说加上ignore,把一些没有的字符集给忽略了,还是乱的!!!

        后面就各种编码方式(utf-8、gb2312、gbk、gb**、utf-8-sig……),各种encode、decode排列组合了,几乎到了奔溃的边缘。(我是谁?我在哪?我在干什么?)

【原创】python3读取操作系统设备中文编码问题——encode、decode_第5张图片

        直到看到有人说更改操作系统的语言设置。

【原创】python3读取操作系统设备中文编码问题——encode、decode_第6张图片

 
【原创】python3读取操作系统设备中文编码问题——encode、decode_第7张图片 【原创】python3读取操作系统设备中文编码问题——encode、decode_第8张图片
【原创】python3读取操作系统设备中文编码问题——encode、decode_第9张图片 【原创】python3读取操作系统设备中文编码问题——encode、decode_第10张图片

 时间和语言-管理语言设置-更改系统区域设置-中文(简体、中国),没错啊!!!我也是这样的啊。重启。好哒,使出我的杀手锏—重启下!!!

稍等片刻,启动pycharm,调试程序……还!是!乱!码!啊!啊!啊!

等下,等下,刚才更改区域语言的时候,下面有一行字是什么来着。Beta版:使用Unicode utf-8提供全球语言支持。

        操作系统没有默认的吗???好哒,勾上,重启。期待的大眼睛!!!

        天啊,解决了,困扰了两天的问题解决了,真的吗,喜出望外。(我是谁?我在哪?我在干什么?)

        五、总结

        当然,关于编码问题,还是那句话,即原始,又避不开。这样设置后,可能有一些软件会不兼容的。

        我们站在巨人的肩上,享受时光静好的同时,适当了解原理和前辈走过的路。希望代码且调且珍惜,bug渐行渐远。

        Ps:

        大家在coding的时候,项目文件开始会留下逼格满满的注释,每创建一个就写一次吗?不存在的。

【原创】python3读取操作系统设备中文编码问题——encode、decode_第11张图片

        在 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}

你可能感兴趣的:(【原创】python3读取操作系统设备中文编码问题——encode、decode)