1. 程式人生 > 其它 >VS2019 visual studio 終端除錯亂碼問題

VS2019 visual studio 終端除錯亂碼問題

目錄
作者使用 VS2019 除錯 python 程式時,終端列印中文出現亂碼。本文收集了網路上解釋,發現缺乏系統闡述,且每個解決均缺乏相關背景概念,不利於遇到同樣問題的使用者排查問題,因此在這裡整理了和亂碼相關的概念終端編碼文字編碼檢視和修改方法。最後對比了常見的亂碼解決方法。

幾個相關概念

  1. "字符集"是字元到其標識程式碼值的對映。

  2. 傳統字符集是前面的字元編碼標準,如使用8位程式碼值或8位值組合來表示特定語言或地理區域中使用的字元的 Windows內碼表。

  3. Unicode 是一種全球字元編碼標準,當今計算機中最常用的字符集,新的 Windows 應用程式應使用 Unicode 來避免不同內碼表的不一致,並有助於簡化本地化。

  4. 雙位元組程式碼標誌,unicode 在windows應用程式使用 UTF-16 實現,由雙位元組程式碼標識。

  5. 內碼表,大多數編寫的應用程式都以 Unicode的形式使用 utf-16 編碼來處理字元資料。 但是,許多舊版應用程式將繼續使用基於內碼表的字符集。

    表1:內碼表標誌符

    標誌符 .net 名稱 其他資訊
    936 gb2312 ANSI/OEM 簡體中文 (中國、新加坡) ;簡體中文 (GB2312)
    65001 utf-8 Unicode (UTF-8)
  6. 舊版本控制檯模式,舊版控制檯模式是一種相容性工具,旨在幫助使用者在 Windows 10 上執行較舊的命令列工具。 對於在預設 Windows 10 控制檯體驗中未正確顯示或執行的任何命令列工具,此模式提供了一種粗粒度的解決方案,可將系統恢復到較舊版本的控制檯託管體驗。舊版本和當前版本之間的主要已知差異是 UTF-8 的實現。 舊版主機在內碼表 65001上提供最基本的 UTF-8 支援[1]

檢視和修改終端編碼

方法1:客戶端檢視

  1. 開啟終端,右鍵導航欄
  2. 點選屬性,計入“選項” 頁,檢視當前內碼表設定
圖1 更改終端內碼表

方法2:終端命令檢視

# 使用 chcp(change code page) 檢視終端編碼 
C:\Users\***>chcp
Active code page: 65001
# 改變終端編碼
C:\Users\***>chcp 936
Active code page: 936

方法3:登錄檔

通過終端修改字符集方法為臨時修改,永久預設為utf-8編碼格式可參考windows cmd客戶端字符集編碼修改

VS中檢視和修改檔案編碼

  1. 參考為檔案選單項,新增高階儲存設定
圖2 VS 新增高階儲存設定
  1. 選擇 Unicode (UTF-8 無簽名 - 內碼表655001),點選確認
圖3 VS 高階儲存選項
3. 新建檔案,就會按剛剛選擇的編碼儲存

Notepad++ 檢視和修改

圖4 Notepad++ 編碼檢視和修改

Sublime檢視和修改

圖5 Sublime 編碼檢視和修改

解決 visual studio 亂碼

系統環境: win11 22000.613
整合開發環境 : Microsoft Visual Studio Community 2019 版本 16.10.3

【問題分析】

亂碼是由編碼衝突引起,這種衝突發生在文字的編碼、終端的編碼、終端字型之間。

圖6 編碼報錯
## 【解決方案】 在 VS2019 中除錯呼叫 CMD 終端,文字編碼採用 utf-8, 調整終端編碼使用 65001(Unicode (UTF-8)),文字和終端編碼時一致時,問題就得到了解決。 結合網上分析,還有兩種操作(==未經本人測試,若讀者有新的測試或者更好的補充可在評論區中新增==):

第一種,修改終端屬性,使用舊版控制檯。這個作用可能是原始檔編碼使用舊版本 utf-8,修改成舊版,可以解決已有檔案的顯示問題,但不能新建檔案的顯示問題;
第二種,勾選區域語言-Beta版:使用Unicode UTF-8 提供全球語言支援,這個修改方案有報道會帶來其他程式亂碼問題。通過該方案奏效的情況可能是 Unicode utf-16 和 utf-8 編碼衝突情形。這裡還提到修改字型對中文顯示的影響,也可以在出現亂碼問題時嘗試。

圖7 Beta版:使用Unicode UTF-8 提供全球語言支援
第一種和第二種方法,經我分析只是解決了部分已有檔案的編碼衝突,可能會引入其他問題,。本質上解決亂碼問題,還是要核對整個流程上使用的解碼方式,保證一致性,即可解決問題。
  1. https://docs.microsoft.com/zh-cn/windows/console/legacymode ↩︎