#c #pointers #unicode #cout
#c #указатели #юникод #cout
Вопрос:
У меня есть переменная типа LPTSTR
, которую я печатаю std::cout
с <<
помощью. В системе ANSI (не знаю точно, где это определено) все работало нормально, она печатала строку. Теперь в системе Unicode я получаю шестнадцатеричный адрес вместо строки. Итак, почему LPSTR
(на который LPTSTR
разрешается, если UNICODE
не определено) действует иначе, чем LPWSTR
(… если UNICODE
определено) и как мне напечатать строку, на которую указывает последнее?
Ответ №1:
Для строк в Юникоде, которые вы хотите wcout
.
Возможно, вы видите шестнадцатеричное значение, потому что выходной поток ANSI / ASCII не знает, как обрабатывать символы Unicode.
LPTSTR
и LPWSTR
на самом деле являются C-измами, унаследованными со времен C Windows API. Для C я бы настоятельно рекомендовал вам использовать вместо этого std::string
и / или std::wstring
.
Если вам нужно создать свой собственный макрос, вам понадобится что-то вроде:
#ifdef _UNICODE
std::wostreamamp; COUT = std::wcout;
#else
std::ostreamamp; COUT = std::cout;
#endif
Комментарии:
1. О, спасибо. И есть ли стандартные макросы, которые автоматически преобразуются в cout или wcout?
2. И об использовании std::string — к сожалению, LPTSTRs используются в функциях WinAPI, поэтому я должен их использовать. И чтобы избежать ненужных преобразований, я должен использовать их все время.
3. Вы можете использовать метод .c_str(), если хотите, чтобы строка в стиле C, заканчивающаяся нулем, передавалась в Windows API.
4. Что касается стандартного макроса: я не уверен (в эти дни я в основном занимаюсь C #). Если я правильно помню, мне пришлось создать свой собственный, но это было несколько лет назад. Это не должно быть слишком сложно. Смотрите отредактированный ответ.
5. Я бы использовал
std::wostreamamp; COUT = std::wcout;
andstd::wostreamamp; COUT = std::cout;
вместо#define COUT wcout
и#define COUT cout