【问题标题】:How can i suppport both Unicode and Multi-Byte Character Set in my code?如何在我的代码中同时支持 Unicode 和多字节字符集?
【发布时间】:2011-05-14 04:38:16
【问题描述】:

我必须说我是 win32 c++ 编程新手,所以我面临一个问题
一些代码在多字节字符集中编译,而不是在 Unicode 字符集中编译。
我的代码如何同时支持两者?
例如,这 NOT 仅在 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))

【问题讨论】:

    标签: c++ winapi unicode multibyte


    【解决方案1】:

    使用TCHAR作为字符类型(例如std::vector&lt;TCHAR&gt;),即:

    如果定义了UNICODE,则为WCHAR,则为CHAR 否则。

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

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

    【讨论】:

    • 在向量中哪里使用?
    【解决方案2】:

    您不必同时支持两者,除非您的应用程序必须支持 Windows Mobile 或桌面版本,如 Windows 95 或更早版本。

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

    【讨论】:

      【解决方案3】:

      您可以使用 microsoft 提供的宏/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
      

      【讨论】:

      • 为什么不直接typedef std::basic_string&lt;TCHAR&gt; String;
      • @Georg 这甚至更短。不错!
      【解决方案4】:

      通过“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 的第三方库),则使用WideCharToMultiByte 和@987654322 转换它们@。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-30
        • 2016-06-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多