一、为测试其他语言的WINDOWS,我在控制面板的“区域和语言选项”中,把系统默认语言改为“英语(美国)”;二、已经使工程为unicode模式,而且界面中的汉字都能以unicode正常显示:
#define UNICODE
#define _UNICODE
#pragma comment(linker, "/entry:\"wWinMainCRTStartup\"")三、下面的代码的执行结果中,汉字为什么变成了问号?
SHFILEINFOA sfi;
SHGetFileInfoA("test.gif", 0, &sfi, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME);
//此时sfi.szTypeName的内容本应为“ACDSee GIF 图像”,但为什么显示为“ACDSee GIF ??”;附加说明:
尝试1:如果把SHFILEINFOA和SHGetFileInfoA都改为相应的unicode版本,则结果汉字正常;
尝试2:如果把“区域和语言选项”中的系统默认语言改为“中文(中国)”,则汉字也会正常。请问,在“英语(美国)环境下,unicode工程中”,这个ANSI版本的函数怎样才能正确得到结果?谢谢!
#include <locale.h>
setlocale(LC_CTYPE, "chs");
而且,我还用setlocale(LC_ALL, "chs");setlocale(LC_CTYPE, "zh");setlocale(LC_ALL, "zh");都试了,都不行。
我的问题可以做简化如下(这个问题和工程是否为unicode没有关系):1、在控制面板的“区域和语言选项”中,把系统默认语言改为“英语(美国)”;
2、工程为ansi工程;
3、下面代码得到的汉字为问号:
SHFILEINFO sfi;
SHGetFileInfo("test.gif", 0, &sfi, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME);
//此时sfi.szTypeName的内容本应为“ACDSee GIF 图像”,但为什么显示为“ACDSee GIF ??”;
sfi.cbFileInfo = sizeof(SHFILEINFOA);
SHGetFileInfoA("test.gif", 0, &sfi, sizeof(SHFILEINFOA), SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME);
最新的简易验证代码如下:
首先,在控制面板的“区域和语言选项”中,把系统默认语言改为“英语(美国)”
#include <windows.h>
#include <shellapi.h>
#include <locale.h>int main(int argc, char* argv[])
{
setlocale(LC_CTYPE, "chs"); SHFILEINFOA sfi;
SHGetFileInfoA("test.gif", 0, &sfi, sizeof(SHFILEINFOA), SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME);
printf("[%s]\n", sfi.szTypeName);
//期望执行结果为:[ACDSee GIF 图像]
//实际执行结果为:[ACDSee GIF ??] return 0;
}
不知道你的机器那里的设置和我的不同