Claude Code 在 Windows 複製中文亂碼?OSC 52 剪貼簿問題完整解析
問題描述
在 Windows 上使用 Claude Code 時,如果開啟了 CLAUDE_CODE_NO_FLICKER=1 環境變數,每次複製內容都會出現以下訊息:
sent N chars via OSC 52 · check terminal clipboard settings if paste fails
複製英文沒有問題,但複製中文時貼上的內容全是亂碼,例如:
?鞎潛倏鋆⊥?????隞歹?瘝?銝剜????閬???
環境資訊
| 項目 | 值 |
|---|---|
| 作業系統 | Windows 11 Pro |
| 終端機 | Windows Terminal |
| Shell | Bash (Git Bash) |
| 系統 ANSI Codepage | 950 (Big5) |
| Claude Code 設定 | CLAUDE_CODE_NO_FLICKER=1 |
根因分析
什麼是 OSC 52?
OSC 52 是一種終端機控制序列(Operating System Command),允許程式透過終端機直接寫入系統剪貼簿。Claude Code 使用這個機制來實現「複製」功能。
流程如下:
- Claude Code 將文字以 UTF-8 編碼後進行 Base64 編碼
- 透過 OSC 52 escape sequence 發送給終端機
- 終端機(Windows Terminal)收到後 Base64 解碼,得到 UTF-8 字節
- 終端機呼叫 Windows 剪貼簿 API 寫入資料
問題出在第 4 步
Windows Terminal 在寫入剪貼簿時,使用系統的 ANSI Codepage(ACP) 來解讀收到的字節。在繁體中文 Windows 上,ACP 是 950(Big5)。
這代表 UTF-8 的字節被當成 Big5 來解讀:
UTF-8 字節:E7 9B AE E5 89 8D → 應該是「目前」
Big5 解讀: ??亂碼?? → 無法正確對應
無法對應 Big5 的字節會被替換成 0x3F(?),原始 UTF-8 資料在這一步就永久遺失了。這代表任何事後從剪貼簿讀取並修復的方案都無法成功。
診斷過程
Step 1:用診斷腳本檢查剪貼簿原始資料
寫一個 PowerShell 腳本,透過 Win32 API(OpenClipboard、GetClipboardData、GlobalLock)直接讀取剪貼簿中 CF_TEXT、CF_UNICODETEXT 等格式的原始字節,觀察資料在各格式下的實際內容。
Step 2:比對 Hex 資料
複製一段含中文的內容後,診斷結果如下:
=== CF_TEXT (format 1) ===
Hex: 3F 8D E5 89 AA E8 B2 BC E7 B0 BF E8 A3 A1 E6 98 AF 3F 9B E6 ...
As UTF-8: ?�剪貼簿裡是?��??�英?��?令...
可以看到:
E5 89 AA(剪)、E8 B2 BC(貼)等部分 UTF-8 序列碰巧也是合法 Big5,所以保留了下來- 但很多字節變成了
3F(?),代表原始 UTF-8 字節被 Big5 解碼器丟棄
UTF-8 和 Big5 的字節範圍有部分重疊。有些 UTF-8 三字節序列剛好也能被 Big5 解讀(雖然會解出不同的字),有些則完全不合法而被替換成 ?。這就是為什麼貼上的結果是「半亂碼」而非「全亂碼」。
Step 3:確認系統 Codepage
Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage' -Name 'ACP'
# 結果:950
ACP = 950(Big5) 就是根因。
解決方案:更改系統 Codepage 為 UTF-8
讓系統 ACP 從 950 (Big5) 變成 65001 (UTF-8),這樣 Windows Terminal 在處理 OSC 52 時就會正確解讀 UTF-8 字節。
操作步驟:
- 開啟 設定 → 時間與語言 → 語言與地區
- 點選 管理語言設定(Administrative language settings)
- 點選 變更系統地區設定(Change system locale)
- 勾選 「使用 Unicode UTF-8 提供全球語言支援」(Beta)
- 確定後重新啟動電腦
將系統 ACP 改為 UTF-8 可能影響部分較舊的中文軟體(如某些使用 Big5 編碼的企業軟體)。多數現代軟體不受影響,但建議先確認你常用的軟體是否相容。
總結
問題的核心在於 Windows 的 ANSI Codepage (Big5) 與 OSC 52 的 UTF-8 輸出不相容。Windows Terminal 收到 UTF-8 字節後用 Big5 解讀,無法對應的字節被不可逆地替換成 ?。
解法就是讓系統 Codepage 改為 UTF-8——到系統地區設定勾選「使用 Unicode UTF-8 提供全球語言支援」,重開機後 OSC 52 就能正確複製中文了。
留言