2013-02-08 83 views
-1

我一直在試圖找到任何信息,但谷歌完全失敗了我。下面的代碼不能編譯爲標準的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

回答

-1

簡短的回答:仔細檢查編碼並使用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

0

較新版本的VC++自動檢測源代碼的「無簽名UTF-8」編碼。

在舊版本的VC++中,您可以嘗試添加UTF-8簽名(又名「BOM」),或使用setlocale pragma

+0

,這沒有幫助。 – einclude 2013-02-09 11:20:25