Re: [問題] 有關UTF8編碼

作者: LPH66 (-6.2598534e+18f)   2014-12-12 19:25:23
: → 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, 不在這範圍的都會變成問號)
作者: PoorLoser (廢文製造機)   2014-12-12 23:34:00
專業
作者: EdisonX (卡卡獸)   2014-12-13 09:51:00
跳 tone 問... _tsystem / _wsystem 可以嗎?當然 _tmain / wmain 後半段的處理還是免不了..
作者: oppositebank (咖哩獸)   2014-12-13 10:03:00
原來如此 感謝!!
作者: LPH66 (-6.2598534e+18f)   2014-12-13 15:22:00
啊, 都忘了 system 也該有對應 t 版跟 w 版那種當然也 OK

Links booklink

Contact Us: admin [ a t ] ucptt.com