Claude Code 中文亂碼?Windows 3 步修好
文 / Coolkid發布:2026-07-16 · 最後更新:2026-07-20閱讀約 10 分鐘

短答給趕時間的人:Windows 終端機預設用 CP950,也就是繁中的舊編碼。這張表跟現代程式預設的 UTF-8 對不上。中文於是變成 ??? 、方塊字,或者 Python 直接吐 UnicodeEncodeError。AI 沒寫錯,是環境編碼對不上。修法 3 步。第 1 步,終端機打 chcp 65001 切 UTF-8。第 2 步,Python 程式設 PYTHONIOENCODING=utf-8。第 3 步,檔案存對格式:.ps1 要存 UTF-8 with BOM、.env 絕對不要 BOM。
這是我的 Threads 自動發文機器人遇過最玄的一次。
程式邏輯全對,在 Claude Code 裡跑也正常,排程半夜自動跑就跳 UnicodeEncodeError。
查了很久才發現,同一支程式,誰來執行、用什麼編碼環境執行,結果會不一樣。
這篇把 Windows 中文編碼的三層問題一次講清楚,讓你少走我那幾個晚上的冤枉路。
30 秒懂原理:中文為什麼會變亂碼?
文字在電腦裡是數字,「編碼」就是數字跟字的對照表。
全世界現在通用的表叫 UTF-8,但 Windows 繁中版的終端機,預設還在用 1990 年代的舊表 CP950。
兩邊用不同的表講話,中文就變成 ??? 或方塊。
像拿不同版本的密碼本對暗號。
所以亂碼有三個可能的案發現場,要分開查。
第一是終端機顯示層,程式輸出 UTF-8,終端機卻用 CP950 讀。
第二是 Python 執行層,程式要輸出中文,但執行環境的輸出編碼是 CP950。這時候就直接報 UnicodeEncodeError: cp950。
第三是檔案儲存層,檔案本身存錯格式,打開就是亂的。
下面三步一層一層解決。
第 1 步:終端機切 UTF-8(顯示層)
終端機看到亂碼,先打這行把當前視窗切到 UTF-8:
chcp 65001
65001 就是 UTF-8 的代碼頁編號。
這行只對當前視窗有效,重開就恢復 CP950。
想一勞永逸有沒有辦法?有,Windows 11 可以改系統設定。
路徑是設定 → 時間與語言 → 語言與地區 → Windows 顯示語言 → 變更系統地區設定。
進去勾選「Beta: 使用 Unicode UTF-8 提供全球語言支援」,勾完重開機,全系統就預設 UTF-8。
注意少數老舊軟體可能因此顯示異常,遇到再取消勾選就好。
第 2 步:Python 設輸出編碼(執行層,排程掛掉 9 成是這個)
AI 寫的 Python 程式印中文,報 UnicodeEncodeError: cp950。
最典型的情況是「在 Claude Code 裡跑正常、丟去 Windows 排程就掛掉」,因為排程執行的環境沒有繼承你終端機的編碼設定。
最穩的解法是設環境變數,讓 Python 一律用 UTF-8 輸出:
# 當次生效(終端機):
set PYTHONIOENCODING=utf-8
# 永久生效(PowerShell,設定使用者層級環境變數):
[Environment]::SetEnvironmentVariable('PYTHONIOENCODING', 'utf-8', 'User')
設完永久版要重開終端機才會生效。
這一步就是我 Threads 機器人那幾個晚上的答案。
程式沒錯,錯在排程器執行時的環境是乾淨的 CP950,跟我平常開著 UTF-8 終端機測試的環境不同。
這就是 Windows 中文版的「在我電腦上可以跑」。
判斷口訣:手動跑正常、自動跑就掛掉 → 查環境變數。連手動跑都掛掉 → 先做第 1 步再做這步。
第 3 步:檔案存對格式(儲存層,兩條鐵律)
最後一層問題出在檔案本身的儲存格式。
UTF-8 有一個小變體叫「UTF-8 with BOM」,檔案開頭多 3 個隱形位元組當記號。
麻煩在哪裡?Windows 有些東西一定要這個記號,有些東西碰到就掛掉。
背下面兩條鐵律就夠了:
- .ps1(PowerShell 指令碼)含中文 → 一定要 UTF-8 with BOM。沒有 BOM,PowerShell 5.1 會用 CP950 去讀,中文註解全成亂碼、字串比對莫名失敗,還可能報一堆看起來像語法錯誤的 UnexpectedToken。但你的語法其實是對的。
- .env(環境變數設定檔)→ 絕對不要 BOM。很多程式讀 .env 是逐字元解析,開頭那 3 個隱形位元組會讓第一行的變數名稱多出看不見的字元,程式讀到的是「(BOM)API_KEY」而不是「API_KEY」,值永遠讀不到,而且錯誤訊息完全看不出原因。
叫 AI 動手時,直接把規則講清楚。
像是「這個 .ps1 存 UTF-8 with BOM」「.env 存 UTF-8 不要 BOM」。Claude Code 聽得懂,一次做對比事後找問題快得多。
用記事本另存新檔時要看清楚,編碼下拉選單裡的「UTF-8」是無 BOM,「具有 BOM 的 UTF-8」才有,別選反。
加碼:.ps1 報「語法錯誤」,為什麼真兇是編碼?
PowerShell 有一個獨家的雷,前面三步都修不到,值得單獨講。
AI 幫你寫了一個 .ps1,也就是 Windows 的自動化指令檔。裡面有中文註解,一跑就跳紅字「UnexpectedToken」或「指派運算式無效」。
看起來像程式寫錯了。
拿回去問 AI,AI 看了說語法沒問題,然後你們就開始鬼打牆,改語法改半天,越改越糊。
真相是這根本不是語法錯誤。
真兇是 PowerShell 5.1,也就是 Windows 本來就附的那一版。這一版用舊編碼表去讀你的 UTF-8 檔案,中文的位元組被拆爛。後面整段程式碼跟著解析壞掉。
這個雷特別麻煩的地方有兩個。
第一,報錯的行號常常指在真正出錯位置的「之後」幾行,你會一直盯著一段完全沒問題的程式碼看。
第二,錯誤訊息裡從頭到尾沒有「編碼」兩個字,只會一直跟你說語法錯。
- 「測試」變成「皜祈岫」這種看得出是字、但完全不通的字 → UTF-8 內容被舊編碼(Big5)誤讀。.ps1 含中文又沒存 BOM,就是這一型。
- 中文變成 ??? 或 � 方塊 → 方向相反,舊編碼的內容被當成 UTF-8 讀,常見於老工具輸出的檔案。認出方向,就知道該修檔案還是修終端機。
這個雷還有一個最坑新手的特性:在別人的電腦上明明跑得動。
我 2026-07-20 在自己機器實測過。
同一份含中文、沒有 BOM 的 .ps1,在我這台開過「Beta UTF-8」系統選項的電腦上直接跑得過,那個設定就是第 1 步結尾提過的。
而照 PowerShell 5.1 的讀檔規則,沒開這個設定的預設 Windows 就會出錯,我自己的出錯紀錄裡就躺著一筆這種紅字。
所以教學影片的截圖都正常、你照著做卻爆炸,原因是兩台電腦的系統編碼設定根本不同,跟你手殘沒關係。
# 檢查 .ps1 有沒有 BOM(貼進 PowerShell,路徑換成你的):
([System.IO.File]::ReadAllBytes("C:\完整路徑\檔名.ps1") | Select-Object -First 3 | ForEach-Object { "{0:X2}" -f $_ }) -join " "
# 回「EF BB BF」= 有 BOM,檔案沒問題,往別處查
# 回別的 = 沒 BOM,就是它,往下看修法
修法有三種,挑一個就好。
最省事是直接叫 AI:「把這個 .ps1 重存成 UTF-8 with BOM」,Claude Code 一句話就處理掉。
手動派:記事本開檔,另存新檔,編碼選「具有 BOM 的 UTF-8」。
釜底抽薪派:請 AI 寫 .ps1 時要求註解全用英文,檔案裡沒有中文,存什麼格式都不會出事。
判斷口訣:.ps1 報語法錯但你看不出哪裡錯 → 先查編碼,再查語法。報錯那行往「前面」找,行號會騙人。
Windows 中文亂碼分三層排查。第一層是顯示層,終端機預設 CP950,打 chcp 65001 切 UTF-8,想永久就開系統的 Beta UTF-8 選項。第二層是執行層,Python 報 UnicodeEncodeError: cp950,設 PYTHONIOENCODING=utf-8 環境變數,「手動跑正常、排程跑就掛掉」9 成是這個。第三層是儲存層,兩條鐵律:.ps1 含中文要 UTF-8 with BOM、.env 絕對不要 BOM。加碼一個 PowerShell 專屬雷:.ps1 報 UnexpectedToken 這種假語法錯誤,報錯的行號還會指錯位置,真兇是編碼。同一份檔案在開過 Beta UTF-8 的電腦實測跑得過(2026-07-20),照 5.1 的讀檔規則,預設的電腦就會出錯。原理一句話:Windows 的舊編碼表跟現代程式的 UTF-8 對不上。這是我 Threads 機器人實際踩過的坑,程式邏輯全對、環境編碼不對,一樣跑不動。
名詞解釋
- 編碼(encoding)
- 電腦儲存文字的方式。Windows 中文環境常用 Big5,多數程式假設 UTF-8,兩邊對不上就變亂碼 — 所以資料夾、檔案建議用英文命名。
- BOM(Byte Order Mark)
- 檔案開頭 3 個隱形位元組的記號,用來標示「這是 UTF-8」。Windows 兩條鐵律:.ps1 含中文要有它、.env 絕對不能有它 — 存反了都會炸,而且錯誤訊息看不出原因。
- 終端機(terminal)
- 「用文字指令操作電腦的視窗」的統稱。Mac 叫 Terminal,Windows 上就是 PowerShell,兩者角色相同。
- PowerShell
- Windows 內建的指令視窗:用打字下指令的方式操作電腦,Claude Code 在 Windows 上就在這裡面跑。按 Win + X 可以叫出來。
- 環境變數(environment variable)
- 放在系統層、不寫進程式碼的設定值,最常用來放 API 金鑰等機密,避免跟著程式碼被公開。
- Python
- 入門門檻最低的主流程式語言之一,資料處理、自動化、AI 領域的首選。
- 排程(cron)
- 讓程式「每天 8 點」「每小時」自動執行的定時器。自動發文、定期抓資料都靠它。
- 機器人(bot)
- 自動執行特定任務的程式,例如 LINE 機器人自動回訊息、發文機器人每天定時發貼文。
相關文章
▸ 常見問題
Claude Code 輸出中文變成 ??? 或亂碼怎麼辦?
先打 chcp 65001 把終端機切到 UTF-8(Windows 繁中終端機預設用 1990 年代的 CP950 舊編碼,跟現代程式的 UTF-8 對不上)。這行只對當前視窗有效。要永久生效,去系統設定開「Beta: 使用 Unicode UTF-8 提供全球語言支援」再重開機。AI 沒寫錯程式,是環境編碼的問題,重下 prompt 沒有用。
PowerShell 跑 .ps1 報 UnexpectedToken 或「指派運算式無效」,但語法明明是對的?
9 成是編碼問題:.ps1 含中文但存成「UTF-8 無 BOM」,PowerShell 5.1 用舊編碼表讀,中文位元組被拆爛、後面整段解析跟著壞,就跳出看起來像語法錯誤的訊息。兩個辨認特徵:報錯行號常指在真正位置之後幾行、錯誤訊息從頭到尾不提編碼。修法:把檔案重存成 UTF-8 with BOM(記事本另存選「具有 BOM 的 UTF-8」,或者直接叫 AI 做),或者整份 .ps1 都不用中文。
PowerShell 中文變成「皜祈岫」這種怪字,跟變成 ??? 是同一個問題嗎?
同一種病,方向相反。看得出是字但完全不通(「測試」變「皜祈岫」),那是 UTF-8 內容被舊編碼 Big5 誤讀,常見於 .ps1 沒存 BOM,要修的是檔案(補 BOM 或改存法)。變成 ??? 或 � 方塊,那是舊編碼的內容被當成 UTF-8 讀,或者終端機顯示不出來,要修的是終端機(chcp 65001)。先認方向再動手,不然會修錯邊。
Python 報 UnicodeEncodeError: cp950 怎麼修?
設環境變數 PYTHONIOENCODING=utf-8,強制 Python 一律用 UTF-8 輸出。當次測試用 set PYTHONIOENCODING=utf-8。永久生效用 PowerShell 打 [Environment]::SetEnvironmentVariable('PYTHONIOENCODING','utf-8','User') 然後重開終端機。特別是「手動跑正常、排程自動跑就掛掉」的情況,排程環境不會繼承你終端機的編碼設定,一定要用環境變數解決。
為什麼程式在 Claude Code 裡跑正常,排程執行就出現編碼錯誤?
因為執行環境不同:你的終端機可能已經切了 UTF-8,但 Windows 排程器啟動程式時用的是乾淨的預設環境(CP950、沒有你設過的當次變數)。解法是把編碼設定寫進「使用者層級環境變數」(PYTHONIOENCODING=utf-8),讓任何環境執行都吃得到。這是我的 Threads 自動發文機器人實際踩過的坑,查了好幾個晚上。
UTF-8 跟 UTF-8 with BOM 差在哪?哪些檔案該用哪個?
BOM 是檔案開頭 3 個隱形位元組的記號。兩條鐵律:.ps1(PowerShell 指令碼)含中文一定要「with BOM」,否則 PowerShell 用舊編碼讀,會亂碼甚至報假的語法錯誤。.env(環境變數檔)絕對不要 BOM,否則第一個變數名稱會多出隱形字元、值永遠讀不到。記事本另存時「UTF-8」= 無 BOM、「具有 BOM 的 UTF-8」= 有,別選反。
看完這篇之前先確認:
- Claude Code 或它跑的程式輸出中文變 ??? 或亂碼
- AI 寫的 Python 一碰中文就 UnicodeEncodeError
- 檔案存完再開變亂碼 或 .ps1 指令碼跑不動
- Mac / Linux 用戶 (UTF-8 是預設,很少踩這雷)
- 亂碼出現在網頁上 (那是 HTML charset 問題,不是終端機)
- 還沒裝 Claude Code (先看安裝那篇)
