2013-02-08 2 views
-1

Google에서 정보를 찾으려고했지만 Google에서 완전히 실패했습니다. 다음 코드는 표준 유니 코드로 컴파일 할 수 없으며 MessageBoxW에서 오류가 발생합니다. MessageBoxW가 손상되어 ollydbg에서 exe 파일을 분해하고 테스트했습니다. 그러나 내 사용자 이름 인 "юзер"는 메시지에서 예상대로 올바르게 표시됩니다). 문제는 C 컴파일러, 어떤 이유로 내 문자열을 올바르게 컴파일하지 못했습니다. 나는 L과 TEXT()를 같은 결과로 시도했다.Visual C++ unicode strings가 손상되었습니다.

이 파일은 BOM이없는 UTF-8로 인코딩 된 유일한 입력 파일입니다 (notepad ++).

 
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 

그것은 절대적이다 :

#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); 
} 

빌드 명령 (I 원시 결과를 얻을 수 cmd.exe를에 수동 컴파일로 전환, 비주얼 스튜디오 2003 및 Visual C++ 6 건물을 시도했지만 오래 전에 포기했다) 아니 사용, 내가 시도한 모든 메서드는 소스 코드에서 정적 문자열을 손상 시키지만 내부 처리 (예 : winapi에서 얻은 것들은 신뢰할 수 있으며 정상적으로 작동합니다.)는 괜찮습니다. 나는 물론, 수작업으로 몇 줄을 작곡 할 수는 있지만, 운 좋게도 나는 많지 않지만 이상하게 들리지는 않습니까?

내가 여기에서 분명한 것은 무엇입니까?

+3

나는 10 년 넘게 컴파일러 사용을 중단 할 것을 제안합니다. 최신 버전의 Visual Studio에서는 해당 코드를 컴파일하고 실행합니다. –

+0

질문을 분명히해야합니다. 먼저 코드가 "컴파일 할 수 없다"고 말합니다. 그런 다음 컴파일 할 때 실행될 때 잘못된 출력을 제공한다고 알려줍니다. 또한 코드를 관련 부분 인 스트링 리터럴로 옮겨야하고 오해의 소지가있는 exe/GetModuleFileName을 제거해야합니다. –

+0

@James : 죄송 합니다만, 컴파일러가 과거에 유니 코드와 정확히 어떻게 작동 했나요? 나는 최신 버전을 지금 다운로드하고있다. 그러나 그것은 이상하다. – einclude

답변

-1

짧은 대답 : 인코딩을 다시 확인하고 Visual C 2008 컴파일러를 사용하십시오 (2005 년부터 작동 할 수도 있음). utf-8! = microsoft unicode, utf-16le입니다. utf-16le로 입력 파일을 인코딩하면 vc2008의 cl과 함께 cmd.exe에서 빌드 할 때 올바른 문자열을 얻습니다.

+0

소스 코드 인코딩은 컴파일 된'wchar_t' 문자열의 인코딩과 아무 관련이 없습니다. – Abyx

+0

너 혼자 시험해 봤어? – einclude

+0

나는 그것이 작동하지 않는다고 말하지 않았다. MS가 UTF-16LE를 사용하지만 파서가 인코딩을 감지 할 수 있기 때문에 작동하지 않습니다. VC++ 2008에서는 UTF-8뿐만 아니라 UTF-16도 사용할 수 있습니다. – Abyx

0

최신 버전의 VC++는 소스 코드의 "서명없이"UTF-8을 자동으로 감지합니다.

VC++의 이전 버전에서는 UTF-8 서명 (일명 "BOM")을 추가하거나 setlocale pragma을 사용할 수 있습니다.

+0

조금 도움이되지 않습니다. – einclude

관련 문제