MinGW 沒辦法用 setlocale 設定字符集 (出現亂碼) ??
来源:9-10 宽字符串与窄字符串的转换

Haowei Hsu
2021-01-06
老師在視頻中示範了 MSVC 的寬窄字符亂碼的處理:
(1) 源文件用utf-8來儲存
(2) 在編譯器選項中加入 "/utf-8"
(3) setlocale(LC_ALL, "zh_CN.utf-8")
的確能夠輸出正確的中文字符。如圖:
可是我將環境換成 MinGW 後,並在編譯器選項中加入:
(1) -finput-charset=utf-8
(2) -fexec-charset=utf-8
(3) -fwide-exec-charset=utf-16le
結果卻出現亂碼?? 而且我發現 setlocale 回傳的是 NULL,代表裡面的參數設錯了??? 如圖:
4回答
-
mingw 确实不支持 setlocale ,不用跟他较劲了
132021-01-09 -
Haowei Hsu
提问者
2021-01-09
老師,我發現:
MinGW的 setlocale 是可以設定第二個參數的。
只不過好像不支持 "zh_CN" 這種地區寫法。
如果寫"cht"、"chinese"...等,setlocale就不會回傳NULL了。
如果要指定終端執行運行時的編碼方式,就輸入".950"、".936"...等等
但是,我輸入了UTF-8的字碼頁".65001"後,卻依然回傳了NULL。
後來我在一個英文頁面上看到有人說:
MinGW的setlocale不支持utf-8的邊碼 (雖然Windows的utf-8字碼頁是存在的)
如果真的是這樣,那估計就真的沒辦法了。
022021-01-09 -
bennyhuo
2021-01-07
用 mac 做了下实验,比较符合预期:
MinGW 默认的 locale 应该跟系统自己的设置有关系,但目前没有办法直接修改,因此表现出来的比较奇怪。这部分暂时先了解即可。如果遇到需要解决的场景,可以使用 Windows 的 api 做转换,例如:https://docs.microsoft.com/en-us/windows/win32/api/stringapiset/nf-stringapiset-multibytetowidechar
转换时可以指定编码类型,避免与 locale 直接产生依赖:MultiByteToWideChar(CP_UTF8, 0, e.what(), (int)strlen(e.what()), &wideWhat[0], (int)wideWhat.size());
这个函数我们在 16章处理下载文件名的cjk字符时也有用到。
00 -
Haowei Hsu
提问者
2021-01-06
所以 mingw 無法打印寬字符的中文嗎?
042021-01-08
相似问题