[C#] CliWrap 遇到中文亂碼問題

2025-07-14

在一些應用裡,我們常常需要呼叫外部指令,例如執行自己寫的 console程式,或是跑報表等其他命令列工具。

過去的做法通常是使用 System.Diagnostics.Process,雖然可行,但要處理輸入輸出、等待結束、取消執行、讀取結果等細節時,程式碼會變得又長又複雜。

後來我發現有個套件叫 CliWrap,能讓這些操作變得簡潔許多,也更容易維護


今天主要不是介紹   CliWrap ,主要是因為我在 Windows 使用的時候,常常會出現亂碼

才發現就是 Big5 根 UTF8 轉碼的問題,後來根GPT 來回周旋,最後終於有一個比較正確的版本

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); var big5 = Encoding.GetEncoding(950); using var ms = new MemoryStream(); await Cli.Wrap("cmd") .WithArguments("/c dir /w") .WithStandardOutputPipe(PipeTarget.ToStream(ms)) .ExecuteAsync(); var output = big5.GetString(ms.ToArray()); Console.OutputEncoding = Encoding.UTF8; Console.WriteLine(output);

基本上他的主要流程就是

cmd.exe (BIG5 bytes)
      ↓
PipeTarget.ToStream(ms)
      ↓
MemoryStream 收原始位元流
      ↓
Encoding.GetEncoding(950).GetString(...)
      ↓
UTF-8 Console 輸出

不然之前在 windows 下面怎麼測試都是出現亂碼,這邊紀錄一下,給需要的人


當麻許的碎念筆記 2014 | Donma Hsu Design.