_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, когда оно есть.