经过更深入的实验,发现只要是控制台程序,ThreadLocale就跟随“非Unicode程序的语言”,而只要是GUI程序,ThreadLocale就跟随用户界面语言。下面的程序展示了实验方法。
<code class="language-cpp">// LuanMaConsoleTest2.cpp : 定义控制台应用程序的入口点。 // #undef UNICODE #undef _UNICODE #include "stdafx.h" #include <windows.h> #include <atlbase.h> #include <atlstr.h> // 英文系统返回804 #pragma comment(linker, "/SUBSYSTEM:CONSOLE /ENTRY:mainCRTStartup") // 英文系统返回409 //#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup") int _tmain(int argc, _TCHAR* argv[]) { CString str; str.Format("%x", GetThreadLocale()); MessageBox(NULL, str, "ThreadLocale", MB_OK); return 0; } </atlstr.h></atlbase.h></windows.h></code>
至此,一个适用于最终用户的特殊乱码解决方法产生了。
适用于最终用户的解决方法
**第一个方案:**安装语言包。对不同用户帐户设置不同的显示语言,在需要运行这些程序的时候切换到使用简体中文的用户帐户,就不会乱码了。这也是最推荐的做法。
**第二个方案:**用十六进制编辑器修改exe。将exe改成控制台程序,ThreadLocale就不会跟随用户界面语言,而是跟随非Unicode程序语言,乱码问题也就解决了。如果使用的是Win7家庭版或专业版、Win8/8.1/10单语言版,就只能用这个方法了。
首先,下载一个十六进制编辑器,用它打开,找到"PE"这个字符串第一次出现的地方,光标放在字母P上面:
然后用编辑器的跳转功能,向前跳转5C(十六进制)字节,这是PE可执行文件的Subsystem字段的偏移(32位和64位程序通用)。
这个位置的原始值应该是02 00即GUI程序(如果不是就错了),将它改为03 00即控制台程序:
保存文件,重新运行,这时乱码已经不存在了。
美中不足是运行时有个黑色的控制台窗口,不过使用时可以将它最小化,不影响正常使用。
**第三个方案:**无意中发现的,安装IE11也可以解决这个问题。
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |