zoukankan      html  css  js  c++  java
  • 【原创】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、文本保存等等,有一环节出现不兼容就会乱码,乱码的形式可谓眼花缭乱,一脸懵逼。(黑人问号脸)可以网上搜索,这里就不阐述了。

            四、解决方法

            在开发的时候,我把程序的编码设为了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}

  • 相关阅读:
    nginx和tomcat访问图片和静态页面的配置方法
    centos7上mysql5.6版本主从复制
    centos7上编译安装mysql5.6
    js去除空格
    屏蔽F1~F12的快捷键的js函数
    js屏蔽浏览器(IE和FireFox)的刷新和右键等功能
    禁止选中页面内容-兼容ie、firefox、chrome
    js获取网页上选中的部分,包含html代码
    一个账号只能在一个地方登陆一次
    c#创建window服务
  • 原文地址:https://www.cnblogs.com/imu-ai/p/12551675.html
Copyright © 2011-2022 走看看