将const char*转换为wstring

Joh*_*auß 24 c++

我正在研究基于锌的闪存应用程序的原生扩展,我需要将a转换const char*为a 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

native.AppendHexDataToFile()需要两个wstring.我对C++并不是很擅长,我认为所有这些不同的字符串类型都令人困惑,我在网上找不到有用的东西.所以我问你们这是怎么做的.

编辑:字符串是UTF-8,我使用的是OSX和Windows XP/Vista/7

Lih*_*ihO 17

我建议你尽可能使用std::stringC风格的字符串(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;
}
Run Code Online (Sandbox Code Playgroud)

检查这些问题:将
多字节字符映射到它们的unicode点表示
为什么使用MultiByteToWideCharArray将std :: string转换为std :: wstring?

  • **免责声明:**`MultiByteToWideChar`是一个仅限Windows的功能.(OP正在使用Windows,但问题仅标记为`c ++`) (9认同)

anh*_*ppe 14

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);
}
Run Code Online (Sandbox Code Playgroud)

参考答案

  • 在 C++17 中弃用 (3认同)
  • 这需要被接受。谢谢。 (2认同)

Sae*_*Mo7 8

您可以将char字符串wstring直接转换为以下代码:

char buf1[] = "12345678901234567890";
wstring ws(&buf1[0], &buf1[20]);
Run Code Online (Sandbox Code Playgroud)