用Visual Studio和命令行得到的结果不同

一个很简单的程序

#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:
vs运行结果

CMD:
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)

阅读 4.6k
1 个回答

Visual Studio 和你自己编译时对源文件所使用的字符编码的理解不一样:

>>> "<字符编码1>".encode('utf-8').decode('gb18030')
'<瀛楃\ue0c1缂栫爜1>'

你的源文件应该是 UTF-8 的,命令行编译时把它当成 GB18030 的了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进