Вопрос по c++ – Конвертировать const char * в wstring

21

Я работаю над собственным расширением для флэш-приложения на основе цинка, и мне нужно преобразоватьconst char* кwstring.

Это мой код:

mdmVariant_t* appendHexDataToFile(const zinc4CallInfo_t *pCallInfo, int paramCount, mdmVariant_t **params) {

    if(paramCount >= 2) {
        const char *file    = mdmVariantGetString(params[0]);
        const char *data    = mdmVariantGetString(params[1]);

        return mdmVariantNewInt(native.AppendHexDataToFile(file, data));
    }
    else {
        return mdmVariantNewBoolean(FALSE);
    }
}

Ноnative.AppendHexDataToFile() нужно дваwstring. I'm not very good with C++ and I think all those different string types are totally confusing and I didn't find something useful in the net. So I'm asking you guys how to do it.

Edit: Строки UTF-8 и я использую OSX и Windows XP / Vista / 7

В дополнение к @ereOn, какую платформу вы используете? FailedDev
Прежде чем пытаться разобраться с символами и широкими символами, вы должны быть в состоянии ответить на следующий вопрос:How are you strings encoded и какое преобразование вы собираетесь делать? ereOn

Ваш Ответ

6   ответов
-1

Вот код, который я нашел;

std::wstring StringToWString(const std::string& s)
 {
 std::wstring temp(s.length(),L' ');
 std::copy(s.begin(), s.end(), temp.begin());
 return temp; 
 }

А вот оригинальное сообщение на форуме с возможным вторым решением с использованием функции Windows API MultiByteToWideChar:

http://forums.codeguru.com/archive/index.php/t-193852.html

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededbasic_stringError: User Rate Limit Exceededsize_type countError: User Rate Limit Exceededstd::vectorError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded' 'Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

В OS X wstring использует UTF-32, а не UTF-16. Вы можете сделать преобразование следующим образом:

#include <codecvt>
#include <string>

// make facets usable by giving them a public destructor
template <class Facet>
class usable_facet
    : public Facet
{
public:
    template <class ...Args>
        usable_facet(Args&& ...args)
            : Facet(std::forward<Args>(args)...) {}
    ~usable_facet() {}
};

std::wstring s2ws(std::string const &s) {
    std::wstring_convert<
        usable_facet<std::codecvt<char32_t,char,std::mbstate_t>>
        ,char32_t> convert;
    std::u32string utf32 = convert.from_bytes(s);
    static_assert(sizeof(wchar_t)==sizeof(char32_t),"char32_t and wchar_t must have same size");
    return {begin(utf32),end(utf32)};
}
2

Вам нужна библиотека, которая может кодировать / декодировать UTF8. К сожалению, эта функциональность не включена в библиотеку std c ++. Вот одна библиотека, которую вы можете использовать:http://utfcpp.sourceforge.net/

Вот пример использования этого:

utf8::utf8to32(bytes.begin(), bytes.end(), std::back_inserter(wstr));
17

Я рекомендую вам использоватьstd::string вместо строк в стиле C (char*) где это возможно. Вы можете создатьstd::string объект изconst char* просто передав его конструктору.

Когда у вас естьstd::string, вы можете создать простую функцию, которая будет конвертироватьstd::string содержащие многобайтовые символы UTF-8 дляstd::wstring содержащие точки в кодировке UTF-16 (16-битное представление специальных символов изstd::string).

Есть больше способов сделать это, вот способ с помощьюФункция MultiByteToWideChar:

std::wstring s2ws(const std::string& str)
{
    int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
    std::wstring wstrTo( size_needed, 0 );
    MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
    return wstrTo;
}

Проверьте эти вопросы тоже:
Отображение многобайтовых символов в их представление точки Unicode
Зачем использовать MultiByteToWideCharArray для преобразования std :: string в std :: wstring?

Error: User Rate Limit Exceededhere, "Your application can convert between Windows code pages and OEM code pages using the standard C runtime library functions. However, use of these functions presents a risk of data loss because the characters that can be represented by each code page do not match exactly"Error: User Rate Limit Exceeded
Disclaimer: MultiByteToWideCharError: User Rate Limit Exceededc++)
Error: User Rate Limit Exceeded
12

AFAIK это работает только с C ++ 11 и выше:

#include <codecvt>

// ...

std::wstring stringToWstring(const std::string& t_str)
{
    //setup converter
    typedef std::codecvt_utf8<wchar_t> convert_type;
    std::wstring_convert<convert_type, wchar_t> converter;

    //use converter (.to_bytes: wstr->str, .from_bytes: str->wstr)
    return converter.from_bytes(t_str);
}

Ссылочный ответ

Error: User Rate Limit Exceeded
5

Вы можете конвертироватьchar строка вwstring прямо как следующий код:

char buf1[] = "12345678901234567890";
wstring ws(&buf1[0], &buf1[20]);

Похожие вопросы