回覆列表
  • 1 # 使用者9616915052726

    你的命令列內碼表是 936 (GBK)。

    故 cmd 會把你的窄字串資料強行當做 GBK 編碼解碼並輸出。

    MinGW 在命令列輸出 UTF-8 的問題不好解決,雖然理論上還是能解決的。

    首先為了看到相對正確的輸出,你要把內碼表設成 65001 (UTF-8)。

    然後有兩種可能,都導致輸出有異常:

    1) 預設開啟 sync_with_stdio() ,此情況下 libstdc++ 用 fwrite 輸出到 stdout 。

    2) 用 sync_with_stdio(false) 後,此情況下 libstdc++ 用 write(fileno(stdout), s, n) 輸出到 stdout 關聯的外部檔案。

    前者問題在於 fwrite 是 msvcrt 中的,和 Win10 的 cmd 有一些相容問題。 msvcr120 等新版 MSVC 執行庫相容性更好,但 MinGW 只連結 msvcrt 。

    後者問題在於實際呼叫的 _write 函式在檢測到命令列的內碼表為 65001 時,會一反常態地在成功時返回 UTF-8 轉換成 UTF-16 後得到的 wchar_t 數;其他內碼表和輸出到檔案的情況都返回輸出位元組數。然而 libstdc++ 實現依賴 write 返回值,這時常導致額外的輸出。

    假如只輸出 ASCII 字元,以上兩種情況都不會觸發顯示錯誤,但內碼表設定就失去意義了。

    如果要解決的話,

    情況 1) ,需要修改 MinGW 以連結更高版本 MSVC 的執行時庫。

    情況 2) ,需要修改 MinGW 實現 write 函式的方式:另外實現一個 write ,檢查命令列內碼表為 65001 的情況,在此情況下校正 _write 的返回值。或者直接全部用 WinAPI 實現。

  • 中秋節和大豐收的關聯?
  • 於洋2012倫敦奧運會發生了什麼?