一次解決console主控台輸出中文亂碼的編碼問題-win10win11均適用

"一次"解決Console(主控台)輸出中文亂碼的編碼問題-Win10,Win11均適用

主控台輸出中文亂碼

之前換新主機時,一開始設定作業系統完成的時候發現一個小問題,不明的原因鍵盤輸入法被預設為「法文」,後來自行換回「英文」之後沒有什麼問題,也就沒去管它了。但系統一直有個小問題,就是,Console主控台的輸出,只要是非英文,都會是亂碼呈現,還好,目前多數CLI,例如,Docker CLI等都是英文輸出,除了一個dotnet CLI。一直沒有想追的原因是,常輸入的參數就那些,想不起來線上查也方便,就一直放著。直到看到黑大的這一篇:「【茶包射手日記】PowerShell 串接 EXE 輸出中文變亂碼」,一行「[Console]::OutputEncoding」立馬點出我的問題:

Console::OutputEncoding

透過指令:[Console]::OutputEncoding = [System.Text.Encoding]::UTF8也確實立馬解決了亂碼問題。

但也立即產生新的問題。這行UTF8的設定,只對當下這個PowerShell Sesssion有效,當我們關閉當前的PowerShell視窗後,就又回到我那個CodePage:437的組態去了。

當下立即想起PowerShell的全域組態檔$PROFILE,執行code $PROFILE加入:

[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
Import-Module posh-git
Import-Module oh-my-posh
Set-Theme Paradox

posh-git、oh-my-posh等設定,可參考:打造高富帥的POWERSHELL CORE命令列模式

測試過後,沒有問題。但現在我的環境中有PowerShell 5.x與PowerShell 7.x,需要在兩個$PROFILE都進行同樣設定,又覺得不滿意。不知道有沒有一個「全域式」的組態,讓我一個設定將我的設定就固定到UTF-8呢?

結果還真的有,但有一點點版本限制,需要Windows 10 version 1903之後的版本。開啟「設定」「語言」「系統管理語言設定」:

系統管理語言設定
變更系統地區設定
使用Unicode UTF-8提供全球語言支援
重新啟動Windows

就這樣,我們就能到不用重覆設定,Console主控台不論是cmd.exe、PowerShell 5.x/7.x等等都能自動套用使用UTF-8字碼的能力。這樣才符合我們標題"一次"的目標。

圖為Windows 10時抓取,此設定在Windows 11一樣的地方,一樣有效。

參考:https://newbedev.com/using-utf-8-encoding-chcp-65001-in-command-prompt-windows-powershell-windows-10

9 則留言:

  1. 立刻馬上選一個用好不好,立馬是啥噁心的劣化中文

    回覆刪除
    回覆
    1. 如果說:「立馬是啥噁心的劣化中文」那我讀的三國演義是什麼書?

      見張飛挺矛立馬於橋上,...
      關公曰:「便是丞相鐵騎來,吾願決一死戰!」遂立馬於橋上望之。
      劉豫州敗走漢津- 長板橋頭殺氣生,橫槍立馬眼圓睜。

      刪除
    2. 你的中文學得有點糟糕欸

      刪除
    3. 高中國文沒學好嗎

      刪除
    4. 等你敢不用匿名,而且言之有物我們再進一步來討論。

      刪除
  2. 你貼的ppt說教育部字典找不到,那我找到的是什麼???

    https://dict.revised.moe.edu.tw/search.jsp?md=4&word=%E7%AB%8B%E9%A6%AC

    回覆刪除
  3. 野人、獻曝、野人獻曝,都不一樣,你可以再查查。

    回覆刪除
  4. 謝謝你的文章!解決了我的問題!非常感謝~!!
    =============
    (看到留言認真回,舉例中的三個三國演義裡的「立馬」都是「騎在馬上」的意思哦)

    回覆刪除
    回覆
    1. 他們其實是古文,只是被對面發陽光大,並不是對面的專門用語,你查教育部國語辭典(https://dict.revised.moe.edu.tw/search.jsp?md=1&word=%E7%AB%8B%E9%A6%AC&qMd=0&qCol=1)是有這樣的用法的。

      刪除

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。