【原創】python3讀取操作系統設備中文編碼問題——encode、decode

来源:https://www.cnblogs.com/imu-ai/archive/2020/03/23/12551675.html

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}


您的分享是我們最大的動力!

更多相關文章
  • 原文鏈接: "http://xiaoheidiannao.com/articles/Screen Keyboard.html" 更多電腦使用技巧可以訪問: "http://xiaoheidiannao.com/articles/Screen Keyboard.html" 查看哦 "" 目錄 "介紹" ...
  • 原文鏈接: "https://xiaoheidiannao.com/articles/Clipboard.html" 更多電腦使用技巧可以訪問 "https://xiaoheidiannao.com" 查看哦! 剪貼板是一個很方便的工具,它能讓用戶存放多個 "複製" 或者 "剪切" 的記錄,但重啟電 ...
  • 更改顯卡配置文件 在目錄 /usr/share/X11/xorg.conf.d 下新建配置文件 10 nvidia.conf,添加如下內容: 在ubuntu18.04中 將最後兩個opyion添加到相應文件中,也可以成功 更改grub啟動參數,打開/etc/default下的grub文件 將 改為 ...
  • 壓縮相關知識常見壓縮文件擴展名:*.Z:compress程式壓縮的文件*.zip:zip程式壓縮的文件*.gz:gzip程式壓縮的文件*.bz2:bzip2程式壓縮的文件*.xz:xz程式壓縮的文件*.tar:tar程式打包的文件,並沒有壓縮過*.tar.gz:tar程式打包的文件,並且經過gzip... ...
  • ContOS7開啟ssh,實現遠程連接 1、查看確認是否已經安裝ssh服務 yum list installed | grep openssh-server 有如下輸出表示已經安裝ssh服務,可以直接去第三步ssh配置。如果什麼也沒提示說明沒有安裝,需要運行第二步安裝ssh服務。 2、安裝ssh服務 ...
  • 一 Pod和SVC網路 1.1 實踐準備及原理 Docker實現了不同的網路模式,Kubernetes也以一種不同的方式來解決這些網路模式的挑戰。本完整實驗深入剖析Kubernetes在網路層是如何實現及工作的。 實驗節點架構: 如上圖所示,Kubernetes的網路模型要求每個Node上的容器都可 ...
  • nc(netcat)實用程式幾乎可用於所有涉及TCP或UDP的事情。它可以打開TCP連接,發送UDP數據包,監聽任意TCP和UDP埠,進行埠掃描,處理IPv4和IPv6。與telnet不同,nc可以很好地編寫腳本,並將錯誤消息分離為標準錯誤,而不是像telnet一樣將錯誤消息發送至標準輸出。 語 ...
  • 環境:使用jenkins通過pipeline拉取github代碼 最近在Jenkins上新建Job時,使用Pipeline流水線方式自動化發佈項目報錯具體如下: ERROR: Timeout after 10 minutes” ERROR: Error fetching remote repo 'o ...
一周排行
  • 《ASP.NET MVC 企業級實戰》 [作者] (中) 鄒瓊俊[出版] 清華大學出版社[版次] 2017年04月 第1版[印次] 2019年08月 第6次 印刷[定價] 89.00元 【第01章】 (P021) 只有在 Lambda 有一個輸入參數時,括弧才是可選的,否則括弧是必需的。 使用空括弧 ...
  • 上一篇(https://www.cnblogs.com/meowv/p/12971041.html)使用HtmlAgilityPack抓取壁紙數據成功將圖片存入資料庫,本篇繼續來完成一個全網各大平臺的熱點新聞數據的抓取。 同樣的,可以先預覽一下我個人博客中的成品:https://meowv.com/ ...
  • 前言 請了一天假後回公司,同事跟我說使用Newtonsoft.json序列化TreeView對象的時候出現報錯; 啊!什麼?這個類庫不是能夠序列化所有東西嗎?真的很懵逼,也是我第一次使用這個類庫出現問題! 問題異常 異常信息 : Newtonsoft.Json.JsonSerializationEx ...
  • 簡單瞭解下麵詞語的意思 節點:二叉樹中每個元素都稱為節點 葉子節點(簡稱:葉子):度為0的節點,葉子節點就是樹中最底段的節點,葉子節點沒有子節點,也叫終端結點 分枝節點:度不為0的結點 節點的度:二叉樹的度代表某個節點的孩子或者說直接後繼的個數,簡單說就是一個節點擁有的子樹數 樹的度: 樹中最大的結 ...
  • C# 中的LINQ 提供了兩種操作方式,查詢表達式和查詢操作符,所有的查詢表達式都有對應的查操作符類替代,查詢表達式有點“類” SQL,在代碼中寫SQL,總覺得不夠“優雅”,使用查詢操作符就顯得“優雅”很多, 本系列就來對所有的LINQ 標準操作符進行一個全面的總結,這些操作符和我上篇文章總結的Rx ...
  • 在Startup ConfigureServices 註冊本地化所需要的服務AddLocalization和 Configure<RequestLocalizationOptions> public void ConfigureServices(IServiceCollection services ...
  • 為什麼需要持久化,以及Redis持久化的RDB方式在這篇文章講的已經很透徹了,足以弔打面試官了。而且此篇內容需要RDB文章的內容支持,所以建議先看下:看完這篇還不懂Redis的RDB持久化,你們來打我! 一、什麼是AOF 它也是Redis持久化的重要手段之一,aof->Append Only Fil ...
  • 先上圖: @IT程式猿 微博網友評論: @迢書:前同事的,親眼見過 @AvenGeeker:Bug 404 @科技州:這是要逼死強迫症 @小島一瞥:哈哈哈哈哈我老家的車 最後小編整理了一套技術資料不僅能精準消除技術盲點、累計面試經驗,更可以攻剋JVM、Spring、分散式、微服務等技術難題。 海量電 ...
  • 概括來說,分三步: 1,首先找到是哪個進程的CPU占有率飆到了100%。 2,根據進程號pid,定位到是哪個線程,找到對應線程的tid。 3,導出對應線程的dump日誌文件,分析日誌文件定位具體代碼。 要解決這個問題,你應該具備以下技能: 1,linux的top命令。 2,jvm監控工具jps。 3 ...
  • 寫在最後 程式員為何害怕【別人的代碼】呢?這讓我想起一個段子。 寫這段代碼時 只有上帝和我知道他是幹嘛的 現在 只有上帝知道了 別人的代碼,似乎總意味著冗長、晦澀、凌亂,給人一種不想靠近的感覺。搞笑的是,對於一些程式員而言,即使是自己的代碼,在一段時間之後自己再拿來看,也成了【別人的代碼】... 作 ...