2009-11-24 2 views
7

У меня есть строка в формате char* и хотел бы преобразовать ее в wchar_t*, чтобы перейти к функции Windows.Как преобразовать строку char в строку wchar_t?

+2

функции Большинство Windows, на самом деле в двух вариантах, A «A "и" W ". Например. MessageBoxA/MessageBoxW, с макросом «MessageBox», ссылающимся на один из двух. Но если вы используете явное имя 'MessageBoxA', вы можете передать' char * 'независимо от параметров проекта. – MSalters

ответ

13

Помогает ли эта небольшая функция?

#include <cstdlib> 

int mbstowcs(wchar_t *out, const char *in, size_t size); 

Также см C++ reference

8

Если вы не хотите, чтобы связать с библиотекой C во время выполнения, используйте API вызова MultiByteToWideChar, например:

const size_t WCHARBUF = 100; 
const char s[] = "HELLO"; 
wchar_t wszDest[WCHARBUF]; 
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szSource, -1, wszDest, WCHARBUF); 
+2

В зависимости от того, откуда берется ваша строка, вы также можете рассмотреть CP_UTF8 вместо CP_ACP. Он может хранить все символы Юникода. – asveikau

+0

Для меня на windows10 с визуальной студией 2017 работал CP_ACP. CP_UTF8 - нет. – netskink

2

винда SDK определяет 2 функции в kernel32.lib для преобразования строк из и в широкий набор символов. это MultiByteToWideChar() и WideCharToMultiByte().

Обратите внимание, что в отличие от названия функции строка не обязательно использует многобайтовый набор символов, но может быть простой строкой ANSI. alse обратите внимание, что эти функции понимают UTF-7 и UTF-8 как многобайтовые символы. широкий набор символов символов всегда UTF-16. Ответ

1

schnaader используют преобразование, определяемый текущей локали C, это один использует локали интерфейс C++ (который сказал, что это было просто?)

std::wstring widen(std::string const& s, std::locale loc) 
{ 
    std::char_traits<wchar_t>::state_type state = { 0 }; 

    typedef std::codecvt<wchar_t, char, std::char_traits<wchar_t>::state_type > 
     ConverterFacet; 

    ConverterFacet const& converter(std::use_facet<ConverterFacet>(loc)); 

    char const* nextToRead = s.data(); 
    wchar_t buffer[BUFSIZ]; 
    wchar_t* nextToWrite; 
    std::codecvt_base::result result; 
    std::wstring wresult; 

    while ((result 
      = converter.in 
        (state, 
        nextToRead, s.data()+s.size(), nextToRead, 
        buffer, buffer+sizeof(buffer)/sizeof(*buffer), nextToWrite)) 
      == std::codecvt_base::partial) 
    { 
     wresult.append(buffer, nextToWrite); 
    } 

    if (result == std::codecvt_base::error) { 
     throw std::runtime_error("Encoding error"); 
    } 
    wresult.append(buffer, nextToWrite); 
    return wresult; 
} 
Смежные вопросы