如何在我的代码中支持Unicode和多字节字符集?

时间:2011-05-14 04:38:16

标签: c++ winapi unicode multibyte

我必须说我是win32 c ++编程的新手,所以我遇到了一个问题 某些代码在多字节字符集中编译,而不是在Unicode字符集中编译 我的代码怎么能同时支持? 例如,此NOT仅在Unicode中编译多字节,仅在MultiByte中编译注释向量:

 //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))

4 个答案:

答案 0 :(得分:6)

使用TCHAR作为字符类型(例如std::vector<TCHAR>),即:

  

如果定义WCHAR,则UNICODECHAR   否则。

     

此类型在WinNT.h中声明为   如下:

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

答案 1 :(得分:4)

除非您的应用程序必须支持Windows 95或Windows 95或更早版本的桌面版,否则您不必同时支持这两种方式。

如果您为当前桌面或服务器Windows编写,支持“Unicode”就足够了。去wchar_t吧!

答案 2 :(得分:0)

您可以使用microsoft提供的宏/ typedef并添加自己的,以支持两者。

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

添加可能很有用,所以你可以使用String类而不是vector来进行文本操作:

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

答案 3 :(得分: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的第三方库一起工作),请使用{{ 3}}和WideCharToMultiByte