Как я могу поддержать как Unicode, так и многобайтовый набор символов в моем коде? - PullRequest
2 голосов
/ 14 мая 2011

Я должен сказать, что я новичок в программировании на win32 c ++, поэтому я столкнулся с проблемой, что
некоторый код компилируется в многобайтовом наборе символов, а не в наборе символов Unicode.
как мой код может поддерживать оба?
например, это НЕ компилируется в многобайтовом режиме только в 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 ]

6 голосов
/ 14 мая 2011

Используйте TCHAR в качестве типа символа (например, std::vector<TCHAR>), то есть:

A WCHAR, если определено UNICODE, a CHAR в противном случае.

Этот тип объявлен в WinNT.h как следующим образом:

#ifdef UNICODE
   typedef WCHAR TCHAR;
#else
   typedef char TCHAR;
#endif
4 голосов
/ 14 мая 2011

Вам не нужно поддерживать оба варианта, если только ваше приложение не должно поддерживать Windows Mobile или настольную версию, например Windows 95 или более раннюю.

Если вы пишете для текущего настольного компьютера или сервера Windows, достаточно поддержки «Юникод». Просто зайдите на wchar_t!

0 голосов
/ 14 мая 2011

Под "новинкой в ​​программировании на 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 и MultiByteToWideChar.

0 голосов
/ 14 мая 2011

Вы можете использовать макросы / typedefs, предоставляемые microsoft, и добавить свои собственные, чтобы поддерживать оба.

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
...