-1

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

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

#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 获得的东西是可信的并且工作正常)。当然,我可以在运行时手动编写几个字符串,幸运的是我没有很多,但这听起来不奇怪吗?

我在这里缺少什么明显的东西?

4

2 回答 2

0

较新版本的 VC++ 会自动检测源代码的“UTF-8 without signature”编码。

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

于 2013-02-09T11:03:46.107 回答
-1

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

于 2013-02-09T10:46:08.560 回答