-1

私は情報を見つけようとしていましたが、Googleは完全に失敗しました。次のコードは標準のユニコードにコンパイルできず、MessageBoxW (MessageBoxW です。ollydbg で exe を逆アセンブルしてテストしました) で破損したものを取得しますが、exe へのパスからのユーザー名 "юзер" がメッセージに正しく表示されます (予想どおり)。 )。問題は C コンパイラです。何らかの理由で文字列を正しくコンパイルできません。L と TEXT() の両方を試してみましたが、結果は同じでした。

これは、BOM なしの UTF-8 (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」エンコーディングが自動的に検出されます。

古いバージョンの VC++ では、UTF-8 署名 (別名「BOM」) を追加するか、setlocaleプラグマを使用できます。

于 2013-02-09T11:03:46.107 に答える
-1

簡単な答え: エンコーディングを再確認し、Visual C 2008 コンパイラを使用します (2005 年から動作する可能性もあります)。utf-8 != utf-16le である Microsoft Unicode。入力ファイルを utf-16le でエンコードすると、vc2008 の cl で cmd.exe からビルドするときに正しい文字列が得られます。

于 2013-02-09T10:46:08.560 に答える