Visual C++损坏的Unicode字符串

问题描述:

我一直在试图找到任何信息,但谷歌完全失败了我。下面的代码不能编译为标准的unicode,并且我在MessageBoxW中得到了损坏的东西(它是MessageBoxW,我已经在ollydbg中反汇编并测试了exe),但是我的用户名“路径”从路径到exe在消息中正确显示)。问题是C编译器,出于某种原因无法正确编译我的字符串。我用相同的结果尝试了L和TEXT()。Visual C++损坏的Unicode字符串

这是唯一的输入源文件,编码为UTF-8,没有BOM(记事本++)。

#define _UNICODE 
#define UNICODE 

#include <windows.h> 

void main() { 
    wchar_t exe[254]; 
    GetModuleFileName(NULL,(wchar_t *)&exe,254); 
    MessageBox(NULL,(wchar_t *)&exe,L"юзер",0); 
    ExitProcess(0); 
} 

构建命令(我试过建筑在Visual Studio 2003和Visual C++ 6,但很久以前放弃了,输入cmd.exe切换到手动编译得到原始结果):

 
cl.exe /c /nologo test-unicode-ui.c 
link.exe /nologo /nodefaultlib /entry:main kernel32.lib user32.lib /OUT:test-unicode-ui.exe test-unicode-ui.obj 

这绝对没有用,我尝试过的每一种方法都给我腐败的源代码静态字符串,但它可以与内部处理(例如,你从winapi得到的东西是可信的,工作正常)。当然,我可以手工编写几个字符串,在运行时,幸运的是我没有很多,但这听起来不奇怪吗?

显而易见,我在这里失踪?

+3

我建议你停止使用十年以上的编译器。较新版本的Visual Studio编译并运行该代码很好。 – 2013-02-08 16:16:32

+0

你应该真的澄清你的问题。首先你说代码“无法编译”。然后你告诉我们,当运行(所以它似乎编译)它会给出错误的输出。此外,你应该剥离你的代码到相关部分 - 字符串文字 - 并摆脱误导的exe/GetModuleFileName(并且不仅告诉我们注释中的细节以回答问题)。 – 2013-02-08 16:27:37

+0

@詹姆斯:我很抱歉,但编译器过去如何与unicode配合使用?我正在下载新版本,但那很奇怪。 – einclude 2013-02-08 16:29:12

简短的回答:仔细检查编码并使用visual c 2008编译器(甚至可能从2005年开始工作)。 utf-8!= microsoft unicode,它是utf-16le。如果使用utf-16le编码输入文件,则在从cmd.exe构建cl时从vc2008构建时会得到正确的字符串。

+0

源代码编码与编译的'wchar_t'字符串的编码无关。 – Abyx 2013-02-09 10:55:03

+0

你只是尝试一下吗? – einclude 2013-02-09 11:15:43

+0

我没有说过它不起作用。它的工作原理并不是因为MS使用UTF-16LE,而是因为解析器可以检测编码。在VC++ 2008中,UTF-8和UTF-16一样。 – Abyx 2013-02-09 13:06:35

较新版本的VC++自动检测源代码的“无签名UTF-8”编码。

在旧版本的VC++中,您可以尝试添加UTF-8签名(又名“BOM”),或使用setlocale pragma

+0

,这没有帮助。 – einclude 2013-02-09 11:20:25