Visual studio visualc&x2B+;损坏的unicode字符串

Visual studio visualc&x2B+;损坏的unicode字符串,visual-studio,visual-c++,unicode,compiler-construction,Visual Studio,Visual C++,Unicode,Compiler Construction,我一直在试图找到任何信息,但谷歌完全失败了。下面的代码无法编译为标准unicode,我在MessageBoxW中得到了损坏的东西(它是MessageBoxW,我在ollydbg中反汇编并测试了exe),但是我的用户名“юззз”从路径到exe在消息中正确显示(如预期)。问题是C编译器,由于某种原因未能正确编译字符串。我尝试了L和TEXT(),得到了相同的结果 这是输入时唯一的源文件,编码为UTF-8,没有BOM(notepad++) \define\u UNICODE #定义UNICODE #包

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

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

\define\u UNICODE
#定义UNICODE
#包括
void main(){
wchar_t exe[254];
GetModuleFileName(NULL,(wchar_t*)&exe,254);
消息框(空,(wchar_t*)和exe,L“юзз”,0);
退出过程(0);
}
< P>构建命令(我尝试在Visual Studio 2003和Visual C++ 6中构建,但很久以前放弃了,切换到CMD.EXE中的手动编译以获得原始结果):< /P> 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获得的东西是可信的,并且工作正常)。当然,我可以在运行时手工编写一些字符串,幸运的是我没有很多,但这听起来不是很奇怪吗


很明显,我在这里遗漏了什么?

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

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


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

我建议您停止使用超过十年的编译器。较新版本的Visual Studio可以很好地编译和运行该代码。您应该真正澄清您的问题。首先你说代码“无法编译”。然后您告诉我们,当运行时(看起来是编译),它给出了错误的输出。此外,您还应该将代码剥离到相关部分-字符串文字-并去除误导性的exe/GetModuleFileName(并且不仅在回答的注释中告诉我们细节)。@James:对不起,但编译器在过去是如何使用unicode的?我现在正在下载更新的版本,但这很奇怪。它们不支持Unicode。他们通常只是将源文件解释为普通的旧ASCII。我想说,即使在今天,在源文件中直接包含Unicode文本也是相当罕见的。在较大的项目中,您更可能从某种外部源(如资源文件或数据库)提取显示的文本。另外,不要忘记,Unicode在过去十年左右才真正被广泛采用——从旧编译器对Unicode的支持程度可以很容易地看出这一点。在Unicode之前,程序员尽可能地处理各种不同的代码页,或者更常见的是,忽略基本ASCII字符集之外的任何内容。源代码编码与编译的
wchar\t
字符串的编码无关。你是不是自己尝试过?我没说它不起作用。这并不是因为MS使用UTF-16LE,而是因为解析器可以检测编码。在VC++2008中,UTF-8与UTF-16一样工作。
#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);
}
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