2011-05-14 62 views
2

我必須說im新的win32 c + +編程,所以我面臨一個問題,
一些代碼編譯多字節字符集,而不是Unicode字符集。
我的代碼如何同時支持?
例如此NOT編譯在多字節只有在Unicode和註釋向量僅在多字節:我如何在我的代碼中支持Unicode和多字節字符集?

//vector<char> str2(FullPathToExe.begin(), FullPathToExe.end()); 
vector<wchar_t> str2(FullPathToExe.begin(), FullPathToExe.end()); 

    str2.push_back('\0'); 
    if (!CreateProcess(NULL, 
        &str2[0], 
        NULL, 
        NULL, 
        TRUE, 
        0, 
        NULL, 
        NULL, 
        &si, 
        &pi)) 

回答

6

使用TCHAR作爲字符類型(例如std::vector<TCHAR>),它是:

甲如果UNICODE被定義,則爲WCHAR,否則爲CHAR

此類型在WINNT.H聲明 如下:

#ifdef UNICODE 
    typedef WCHAR TCHAR; 
#else 
    typedef char TCHAR; 
#endif 
+0

在向量中使用它的地方? – user63898 2011-05-14 05:15:30

+0

@user:'std :: vector '。 – 2011-05-14 05:16:34

0

你可以使用微軟提供的宏/ typedef和添加自己的,同時支持。

TCHAR -> typedef to char/wchar_t 
_TEXT() -> creates a text constant either wide or multibyte _TEXT("hallo") 

可能有用的補充,所以你可以使用,而不是用於文本操作載體的String類:

#ifdef UNICODE 
    typedef std::wstring String; 
#else 
    typedef std::string String; 
#endif 
+0

爲什麼不只是'typedef std :: basic_string String;'? – 2011-05-14 05:56:40

+0

@Georg這個更短。太好了! – 2011-05-14 06:36:53

4

你不必支持,除非你的應用程序必須支持Windows Mobile或像Windows 95或更舊的桌面版本。

如果您爲當前桌面或服務器Windows編寫代碼,則支持「Unicode」就足夠了。只要去wchar_t

0

「新的Win32 C++編程」,我假設你的意思是你不要有一個現有的大型程序使用「ANSI」字符串,你需要維護。如果是這樣,那麼爲什麼你建立一個「ANSI」版本?只要用wchar_t來完成所有的事情。

vector<wchar_t> str2(FullPathToExe.begin(), FullPathToExe.end()); 

str2.push_back(L'\0');  // Note the prefix. 
if (!CreateProcessW(NULL, // Note the W; explicit is better than implicit. 
        &str2[0], 
        NULL, 
        NULL, 
        TRUE, 
        0, 
        NULL, 
        NULL, 
        &si, 
        &pi)) 

如果您需要多字節字符串的工作(例如,閱讀文件,或與使用char而不是wchar_t第三方庫的工作),然後使用WideCharToMultiByteMultiByteToWideChar它們轉換。

相關問題