2021年5月23日 星期日

windows git bash 遇到 cp950 顯示亂碼問題

markdown 最近在 windows git bash 遇到執行程式時中文顯示亂碼的問題,但是在 windows cmd.exe 卻可以正常顯示,例如下圖用 ping 指令,當用 Ctrl-C 結束執行時,windows git bash 顯示亂碼。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4BBDug-9QU5ilYgv9mQOxVUZhjQFlcE1aXXc_Rix-vaBx308E58Bkza47ds_1dDrn9R4HfOqqCyBwq9JGFAz3tbkXUaEXoTAgxGdfcvv1bYu1gviwjs-dbDX0oyn4kDnU4G3HkfKHk-EB/s0/Image+5.png) 為什麼會這樣,可以先來做一個實驗,將下面的程式用 cp950 的編碼儲存為 a.cpp 檔案。
#include <cstdio>

int main()
{
    printf("中文");
    return 0;
}
然後我們用 cl.exe 編譯這個程式,如果檔案編碼的確是用 cp950 儲存,編譯器不會有警告,反之則會有警告。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfppplz29Cxky6GlJfubmV7rbjNS90zgj3anew2QE6-NysjEYjFd3tblvrPK7K6frlHLrpxy4V4jqfups68AH4N3wfSokhnJQyu1OwdzHqKmtLX4kCnVh4ylp5_yNbudnpzyFzLepE0NVa/s0/cl.png) 然後在 windows cmd.exe 跟 windows git bash 中執行編譯好的執行檔,會發現跟上面的 ping 指令一樣,windows cmd.exe 正常,windows git bash 亂碼。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSpe-AT_rfBU1yRxw-xxGGSyD1WKSMBarWo4zZ_OGy7ldwwil0fyVSHQHRcGhVdX5uL9hFOwGYstt5pH2cnbasposH_NnN2t7621zpy2lKeLS0XGRTsHdznN8kZT9J3J3c8KQIpO1UlM4X/s0/Image+7.png) 究其原因,是因為 windows git bash 預設是使用 utf-8 編碼,當它遇到 cp950 編碼的中文,不知道怎麼顯示,於是就變亂碼,而 cmd.exe 預設就是 cp950,所以可以正確顯示。 windows 一些老舊的內建程式還在使用 cp950 輸出文字,例如上面的 ping 指令,如果每次要用到這些指令就要切到 cmd.exe,實在太麻煩了,不過還好 windows git bash 內建的一個工具 winpty 可以很好的解決這個問題。 [官網](https://github.com/rprichard/winpty)上對 winpty 的描述如下。
winpty is a Windows software package providing an interface similar to a Unix pty-master for communicating with Windows console programs. The package consists of a library (libwinpty) and a tool for Cygwin and MSYS for running Windows console programs in a Cygwin/MSYS pty.
可以看到,其實 winpty 的本職工作是在 windows 上做一個類似 linux 虛擬終端的,只是剛好它有將 cp950 轉為 utf-8 輸出的功能而已。關於虛擬終端是甚麼,超過這裡討論的範圍,想了解的可以看[網上這篇](https://zhuanlan.zhihu.com/p/61369678)有詳細的講解,不想了解的也沒關係,只要知道它能幫我們解決windows git bash 遇到 cp950 的亂碼問題就好。 使用方法只要將指令放在 winpty 後面就可以,如下圖所示,可以看到用 winpty 之後 ping 指令就可以正常顯示中文了。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrYreGQWBEPNV205YaaPCWnq9WQHzaeyH_jP5IrQ_GoaS5524_6-mHBNV0FePtLXEFGb2FVYvGMt-A_f6zOfe5gz2Iyvk5ywJR90SVkmxMAFX0uiAelU6xX8QVFjI3FpRWU3CF3k_sqnHG/s0/Image+4.png) --- * [winpty github](https://github.com/rprichard/winpty) * [Cygwin系列(十一):折騰終端2](https://zhuanlan.zhihu.com/p/102393122) * [Linux Cygwin知识库(一):一文搞清控制台、终端、shell概念](https://zhuanlan.zhihu.com/p/61369678)

沒有留言:

張貼留言