_tcslen в многобайтовом наборе символов: как преобразовать WCHAR [1] в const char *?

Я ищу в интернете около 2 часов и не нахожу никакого рабочего решения.

Моя программа имеет многобайтовый набор символов, в коде я получил:

 WCHAR value[1];

 _tcslen(value);

И при компиляции я получил ошибку:

'strlen': невозможно преобразовать параметр 1 из 'WCHAR [1]' в 'const char *'

Как преобразовать этот WCHAR [1] в const char *?

4 ответа

Я предполагаю, что не очень полезная 1-длина WCHAR массив это просто пример...

_tcslen не функция; это макрос, который расширяется до strlen или же wcslen в соответствии с _UNICODE определить. Если вы используете многобайтовый набор символов (что означает _UNICODE Не определены) и у вас есть WCHAR массив, вам придется использовать wcslen в явном виде.

(Если вы не используете TCHAR в частности, вы, вероятно, хотите избежать функций _t. В MSDN есть не очень хороший обзор по адресу http://msdn.microsoft.com/en-us/library/szdfzttz(VS.80).aspx; кто-нибудь знает что-нибудь лучше?)

Попробуйте установить "использовать Unicode" в настройках ваших проектов в VS, если вы хотите _tcslen быть wcslenустановите для него значение "использовать многобайтовые" для _tcslen быть strlen, Как уже отмечалось, _t префиксные функции (как и многие другие на самом деле, например, MessageBox()) являются макросами, которые "расширяются" на основе _UNICODE прекомпилятор определяет значение.

Другой вариант будет использовать TCHAR вместо WCHAR в вашем коде. Хотя я бы сказал, что лучшей идеей будет придерживаться wchar_t или же char типы и использовать соответствующие функции с ними.

И последнее, но не менее важное, поскольку вопрос помечен как C++, рассмотрите возможность использования std::string (или же std::wstring в этом отношении) и std::vector вместо буферов символов. Использование таких функций с API C тривиально и, как правило, намного безопаснее.

Используйте функцию преобразования WideCharToMutliByte ().

http://msdn.microsoft.com/en-us/library/dd374130(VS.85).aspx

_tcslen принимает указатели или массивы WCHAR в качестве входных данных только тогда, когда UNICODE #defined определен в вашей среде.

Из сообщения об ошибке я бы сказал, что это не так

Лучший способ определить юникод - это передать его в качестве параметра компилятору. Для Microsoft C вы бы использовали переключатель /D

cl -c /DUNICODE myfile.cpp

или вы можете изменить объявление массива на TCHAR, которое подобно _tcslen будет символом, если UNICODE не #defined, и WCHAR, когда оно есть.

Другие вопросы по тегам