经过更深入的实验,发现只要是控制台程序,ThreadLocale就跟随“非Unicode程序的语言”,而只要是GUI程序,ThreadLocale就跟随用户界面语言。下面的程序展示了实验方法。
// 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>
至此,一个适用于最终用户的特殊乱码解决方法产生了。
适用于最终用户的解决方法
**第一个方案:**安装语言包。对不同用户帐户设置不同的显示语言,在需要运行这些程序的时候切换到使用简体中文的用户帐户,就不会乱码了。这也是最推荐的做法。
**第二个方案:**用十六进制编辑器修改exe。将exe改成控制台程序,ThreadLocale就不会跟随用户界面语言,而是跟随非Unicode程序语言,乱码问题也就解决了。如果使用的是Win7家庭版或专业版、Win8/8.1/10单语言版,就只能用这个方法了。
首先,下载一个十六进制编辑器,用它打开,找到"PE"这个字符串第一次出现的地方,光标放在字母P上面:
然后用编辑器的跳转功能,向前跳转5C(十六进制)字节,这是PE可执行文件的Subsystem字段的偏移(32位和64位程序通用)。
这个位置的原始值应该是02 00即GUI程序(如果不是就错了),将它改为03 00即控制台程序:
保存文件,重新运行,这时乱码已经不存在了。
美中不足是运行时有个黑色的控制台窗口,不过使用时可以将它最小化,不影响正常使用。
**第三个方案:**无意中发现的,安装IE11也可以解决这个问题。