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
ShellBash (Git Bash)
系統 ANSI Codepage950 (Big5)
Claude Code 設定CLAUDE_CODE_NO_FLICKER=1

根因分析

什麼是 OSC 52?

OSC 52 是一種終端機控制序列(Operating System Command),允許程式透過終端機直接寫入系統剪貼簿。Claude Code 使用這個機制來實現「複製」功能。

流程如下:

  1. Claude Code 將文字以 UTF-8 編碼後進行 Base64 編碼
  2. 透過 OSC 52 escape sequence 發送給終端機
  3. 終端機(Windows Terminal)收到後 Base64 解碼,得到 UTF-8 字節
  4. 終端機呼叫 Windows 剪貼簿 API 寫入資料

問題出在第 4 步

Windows Terminal 在寫入剪貼簿時,使用系統的 ANSI Codepage(ACP) 來解讀收到的字節。在繁體中文 Windows 上,ACP 是 950(Big5)

這代表 UTF-8 的字節被當成 Big5 來解讀:

UTF-8 字節:E7 9B AE E5 89 8D  →  應該是「目前」
Big5 解讀:  ??亂碼??            →  無法正確對應
DANGER — 不可逆的資料破壞

無法對應 Big5 的字節會被替換成 0x3F?),原始 UTF-8 資料在這一步就永久遺失了。這代表任何事後從剪貼簿讀取並修復的方案都無法成功。


診斷過程

Step 1:用診斷腳本檢查剪貼簿原始資料

寫一個 PowerShell 腳本,透過 Win32 API(OpenClipboardGetClipboardDataGlobalLock)直接讀取剪貼簿中 CF_TEXTCF_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 解碼器丟棄
INFO — 為什麼部分中文正確、部分亂碼?

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 字節。

操作步驟:

  1. 開啟 設定時間與語言語言與地區
  2. 點選 管理語言設定(Administrative language settings)
  3. 點選 變更系統地區設定(Change system locale)
  4. 勾選 「使用 Unicode UTF-8 提供全球語言支援」(Beta)
  5. 確定後重新啟動電腦
Windows 系統地區設定,勾選 UTF-8 選項
在系統地區設定中勾選 UTF-8 Beta 選項
WARNING — 潛在副作用

將系統 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 就能正確複製中文了。

留言