

【茶包射手日記】PowerShell 串接 EXE 輸出中文變亂碼
source link: https://blog.darkthread.net/blog/ps-pipeline-exe-encoding/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

上週介紹過用 PowerShell 串接 EXE 輸出結果的技巧,後續遇到一個問題 - 有些 EXE 程式輸出的中文會變亂碼。
例如,findstr 與 pktmon 在未加參數時會顯示中文說明:
同樣用 | ForEach-Object { $_ } 串接顯示,findstr 沒問題,pktmon 的中文說明卻會變亂碼:
原以為跟 DOS CodePage 有關,試過切換 cpch 65001 無效。
找到一篇微軟 PowerShell 部落格,得知有個 $OutputEncoding 可以排除 PowerShell Pipeline 輸出到 EXE 的編碼問題 (例如:test.txt 內容為"中文",Get-Content test.txt | findstr /c:中
會比對不到,需將 $OutputEncoding 改為中文語系),但加了 $OutputEncoding = [Console]::OutputEncoding (中文 Windows 的 [Console]::OutputEncoding 預設為 Big5 950) 一樣沒用。
我想起之前還學過一招 $PSDefaultParameterValues['*:Encoding'] = 'utf8' 可修改 Cmdlet 編碼,理論上影響與外部程式溝通的是 $OutputEncoding,但我已進入病急亂投醫模式,雖然心虛還是先試再說,果然,沒有科學根據亂試會成功都是奇蹟。
還是回歸科學分析吧! 我找到 pktmon 亂碼有段「help 憿舐內?孵??賭誘...」原文為「help 顯示特定命令的說明文字。」,試著剖析它是怎麼錯亂的。
花了點時間,我找出它錯亂的來源:
上面程式成功重現 憿舐內?孵??賭誘... 這段亂碼,方法是硬把 UTF-8 內容當成 BIG5 解析。
由這個結果,我有個猜想,莫非 pktmon 輸出的是 UTF-8 編碼,但 [Console]::OutputEncoding 預設值為 BIG5(950),硬把 UTF-8 當 BIG5 解才搞出亂碼。那如果把 [Console]::OutputEncoding 改成 UTF-8 呢? 薑薑薑薑~~~ 就這麼成功了!
但我觀察到另一個現象,findstr、ping 原本說明文字為中文,在設定 [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 之後,兩支程式都改顯示英文。
關於這點,我的推論是 - findstr、ping 這些存在多年的程式比較成熟,有能力偵測 Console.OutputEncoding 自動切換語系編碼,而 Pktmon 剛出道還很青澀,只會統一輸出 UTF-8。不過,既然我們已知道上述技巧,未來遇到 Pipeline 接 EXE 輸出變成亂碼,就知道該怎麼做囉~
Recommend
-
17
【茶包射手日記】怪異的 .NET 數學運算溢位錯誤-黑暗執行緒 同事報案,某支提供檔案下載的 ASP.NET 程式,用瀏覽器可正常開啟,但有一支用 HttpWebRequest 存取它的 .NET 程式,原本可以執行,現在則出現 Arithmetic operation resulted in an ove...
-
11
【茶包射手日記】IIS 整合式登入 MSSQL 之 AppPool 身分疑雲-黑暗執行緒前天提到我在 IIS 試跑 ASP.NET Core 開源專案 - Kandu,它的資料庫是用 MSSQL,本機跑測試我懶得開帳號,便把連線字串設成 Integrated Security=SSPI 打算走整合式驗證,用 AppPool 的身...
-
12
【茶包射手日記】IIS 跑 ASP.NET Core 出現 500.19 0x8007000d 錯誤-黑暗執行緒 低級錯誤一枚。 我玩 ASP.NET Core 多半是跑 VS 偵錯後丟進 Docker 跑,很久沒部署到 IIS,但方法我還記得:Publish、開 AppPool,也記得要設成「沒有受控碼」(No Man...
-
13
【茶包射手日記】從 Oracle 改用 MSSQL 出現中文亂碼-黑暗執行緒 將某個老系統的資料來源由 Oracle 換成 MSSQL,遇到一個有意思的狀況。 在 Oracle 與 MSSQL 都有 Schema 完全相同的資料表,資料原本來自 Oracle NVARCHAR,改用 MSSQL 後,部分中文...
-
13
【茶包射手日記】偶發型 Oracle Client 版本不相容錯誤-黑暗執行緒同事報案,有個 ASP.NET 網站「偶爾」會出現提供者與 Oracle 從屬版本不相容錯誤。這是 Unmanaged ODP.NET...
-
27
【茶包射手日記】用 USB 安裝 Win10 找不到媒體驅動程式-黑暗執行緒2018 開春第一砲包。 元旦在家當工具人,幫小閃光的 Toshiba 小筆電重灌 OS。Windows 10 1709 的 ISO 檔超過 4.8 GB 燒不進 DVD.....
-
63
【茶包射手日記】超詭異 Oracle Unicode 難字問題-黑暗執行緒Oracle 遇難字出錯不算新鮮事,現象不外乎中文字變空白變方格變問號變亂碼,老司機們一眼便知,該怎麼做心裡有數,但這回我遇到超不一樣的變種。(這樣算有吸引詭異茶包的特殊體質嗎?) 碰到一...
-
6
使用 PowerShell 串接 EXE 輸出串流結果-黑暗執行緒 突發奇想,如果手上有個現成 Command Line 的監控性質程式(.EXE),會在執行過程即時輸出事件或統計資訊,有沒有可能把它接進 PowerShell Pipeline 即時分析並做出回應呢? 舉個例子,像是 ping -...
-
9
【茶包射手筆記】PowerShell 轉存 git 輸出到文字檔,中文變亂碼-黑暗執行緒 問題很簡單。git diff HEAD HEAD~ > diff.txt 將修改差異轉存 diff.txt,在 Cmd DOS 視窗執行沒什麼問題:
-
8
【茶包射手日記】PowerShell Invoke-WebRequest 呼叫 IIS 出錯時顯示亂碼-黑暗執行緒 同事反映 WebAPI 有問題,我提供了一段 PowerShell Invoke-WebRequest -Method POST 程式片段請他對照錯誤,他回報出現 502 錯誤,但訊息是亂碼:(為方便觀...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK