一个很简单的程序
#include <Windows.h>
#pragma comment (lib, "kernel32.lib")
#pragma comment (lib, "user32.lib")
#pragma comment (lib, "gdi32.lib")
#pragma comment (lib, "comdlg32.lib")
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
LPWSTR szUnicode = L"This is a Unicode String";
LPSTR szMutliByte = "This is not a Unocide String";
LPTSTR szString = TEXT("This is a string Unicode or not depends on the option");
MessageBoxW(NULL, szUnicode, L"<字符编码1>", MB_OK);
MessageBoxA(NULL, szMutliByte, "<字符编码2>", MB_OK);
MessageBox(NULL, szString, TEXT("<字符编码3>"), MB_OK);
return 0;
}
为什么这段程序用命令行和Visual Studio得到的结果不同呢?
Visual Studio:
CMD:
下面是 cmd 编译用的 Makefile
# Nmake macros for building Unicode.exe
OUTDIR = Bin
#----Build Rule ---
all: $(OUTDIR) $(OUTDIR)\unicode.exe
#----If OUTDIR not exist then Create it --
$(OUTDIR) :
if not exist "$(OUTDIR)/$(NULL)" mkdir $(OUTDIR)
#----compile --
$(OUTDIR)\unicode.obj: unicode.c
cl -c -DCRTAPI1=_cdec1 -DCRTAPI2=_cdec1 -nologo -GS -D_X86=1 -DWIN32 -W3 \
-D_WINNT -D_WIN32_WINNT=0x0500 -D_WIN32_IE=0x0500 -DWINVER=0x0500 -D_MT -MTd \
/Gz /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\" unicode.c
#----link --
$(OUTDIR)\unicode.exe: $(OUTDIR)\unicode.obj
link /INCREMENTAL:NO /NOLOGO -subsystem:windows -out:$(OUTDIR)\unicode.exe \
$(OUTDIR)\unicode.obj kernel32.lib ws2_32.lib mswsock.lib advapi32.lib
#----clean rule --
clean:
if exist $(OUTDIR)/ rd /s /q $(OUTDIR)
Visual Studio 和你自己编译时对源文件所使用的字符编码的理解不一样:
你的源文件应该是 UTF-8 的,命令行编译时把它当成 GB18030 的了。