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