Вам необходимо преобразовать строку char*
- "многобайтовую" на языке ISO C - в строку wchar_t*
- "широкий символ" на языке ISO. Стандартная функция, которая делает это, называется mbstowcs
(«Строка из нескольких байтов в строку широких символов»)
ПРИМЕЧАНИЕ : как Стив указал в комментариях, это функция C99 и, следовательно, не совместимая с ISO C ++, но может поддерживаться реализациями C ++ как расширение. MSVC и g ++ поддерживают его.
Используется таким образом:
const char* input = ...;
std::size_t output_size = std::mbstowcs(NULL, input, 0); // get length
std::vector<wchar_t> output_buffer(output_size);
// output_size is guaranteed to be >0 because of \0 at end
std::mbstowcs(&output_buffer[0], input, output_size);
std::wstring output(&output_buffer[0]);
Если у вас есть два wstring
с, просто сравните, как обычно. Обратите внимание, что для преобразования будет использоваться текущий языковой стандарт системы (т. Е. В Windows это будет текущая кодовая страница «ANSI») - обычно это именно то, что вам нужно, но иногда вам придется иметь дело с определенной кодировкой, и в этом случае вышеописанное не сработает, и вам нужно будет использовать что-то вроде iconv
.
EDIT
Все остальные ответы, похоже, предназначены для прямой трансляции кодовой точки (т. Е. Эквивалент (wchar_t)c
для каждого char c
в строке). Это может не работать для всех локалей, но будет работать, если, например, все ваши char
- ASCII или Latin-1, а ваши wchar_t
- Unicode. Если вы уверены, что это именно то, что вам действительно нужно, самый быстрый способ - вообще избежать конверсии и использовать std::lexicographical_compare
:
#include <algorithm>
const char* s = ...;
std::wstring ws = ...;
const char* s_end = s + strlen(s);
bool is_ws_less_than_s = std::lexicographical_compare(ws.begin, ws.end(),
s, s_end());
bool is_s_less_than_ws = std::lexicographical_compare(s, s_end(),
ws.begin(), ws.end());
bool is_s_equal_to_ws = !is_ws_less_than_s && !is_s_less_than_ws;
Если вам необходимо проверить равенство, используйте std::equal
с проверкой длины:
#include <algorithm>
const char* s = ...;
std::wstring ws = ...;
std::size_t s_len = strlen(s);
bool are_equal =
ws.length() == s_len &&
std::equal(ws.begin(), ws.end(), s);