看板 C_and_CPP 關於我們 聯絡資訊
: → serikafan: 你的程式碼我在linux下用utf8的環境執行是正常的,不過 12/12 13:19 : → serikafan: windows的cmd環境應該沒支援utf8,我想應該是字串被當成 12/12 13:23 : → serikafan: 系統語系處理(big5之類的)出的問題 12/12 13:24 應該是語系問題無誤 原 PO 的輸入是由 command line 進去的 如果 A.exe 裡使用的是 system 呼叫 B.exe 的話 那裡面呼叫到的 Windows API 是 CreateProcess 而非 Unicode 版的 CreateProcessW 也就是它會將字串視為當下語系編碼進行轉碼再送進後端 這樣一來你的 UTF8 字串就會被當成 Big5 之後轉成 Unicode 才進入 Windows 後端 這時字串就已經壞掉了 接著 Windows 要將這個字串餵進 B.exe 由於 B.exe 的進入點是 main, 這告訴 Windows 這支程式需要當下語系的命令列字串 因此 Windows 將剛才轉成 Unicode 的字串再轉回當下語系 Big5 再送進程式 這就是 B.exe 裡收到的命令列了 於是在這個轉碼過程裡幸運地沒被破壞的字就會正常輸出 不幸地由於在錯誤的位置出現 0x80~0x9F 的 byte 使得 Big5 轉碼失敗的就會變成問號 (Big5 的第二位元組限定在 0x40~0x7E 及 0xA1~0xFE, 不在這範圍的都會變成問號) --- 於是這裡有兩個地方需要調整 一是 A.exe 裡不能直接以 system 呼叫 而需要以 Unicode 版 API CreateProcessW 進行之 (不過注意 CreateProcessW 不能送唯讀字串進去 這是由於 CreateProcessW 會修改字串內容以分出參數的關係 CreateProcess 沒有這個問題是因為它是先經過轉碼再送給 CreateProcessW 轉碼後的字串空間是 CreateProcess 自己開的, 當然一定是可寫) 二是 B.exe 需要用 wmain 作為進入點 (第二參數的型態則要改成 wchar_t*[]) 這同時需要開啟 Unicode 支援, 一般來說是用 /D_UNICODE 定義 "_UNICODE" 這個符號 不過在這裡就不能使用一般的字串函數而要使用 <cwchar> 裡帶 w 的字串函數了 另外這裡也有一種做法是 #include <tchar.h> 然後所有字串函數跟 main 都使用帶 t 的版本 這樣它會視有沒有 _UNICODE 這個符號的定義來使用原版或 Unicode 版函數 (事實上根據微軟文件, <tchar.h> 有三種模式, _UNICODE、_MBCS 跟兩個都沒定義 不過後兩者的差別比較小就是了) --- 如果這樣弄比較麻煩的話 其實還有另一個方法是 B.exe 不從命令列接輸入而改從標準輸入接 然後 A.exe 用 pipe 灌過去 這裡 Windows 有他自己的 _popen, 用法跟 linux (POSIX) 版的 popen 差不多 那由於參數是字串的關係, 也有 w 版跟 t 版, 可以適當選用 -- 'You've sort of made up for it tonight,' said Harry. 'Getting the sword. Finishing the Horcrux. Saving my life.' 'That makes me sound a lot cooler then I was,' Ron mumbled. 'Stuff like that always sounds cooler then it really was,' said Harry. 'I've been trying to tell you that for years.' -- Harry Potter and the Deathly Hollows, P.308 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.30.32 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1418383525.A.C71.html
PoorLoser: 專業 12/12 23:34
EdisonX: 跳 tone 問... _tsystem / _wsystem 可以嗎? 12/13 09:51
EdisonX: 當然 _tmain / wmain 後半段的處理還是免不了.. 12/13 09:54
oppositebank: 原來如此 感謝!! 12/13 10:03
LPH66: 啊, 都忘了 system 也該有對應 t 版跟 w 版 12/13 15:22
LPH66: 那種當然也 OK 12/13 15:22