将 const char\* 转换为 wstring

新手上路,请多包涵

我正在为基于锌的闪存应用程序进行本机扩展,我需要将 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 。我对 C++ 不是很好,我认为所有这些不同的字符串类型完全令人困惑,而且我在网络中没有找到有用的东西。所以我问你们怎么做。

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

原文由 Johannes Klauß 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

我建议您尽可能使用 std::string 而不是 C 风格的字符串( char* )。您可以从 const char* 创建 std::string 对象,只需将其传递给其构造函数即可。

拥有 std::string 后,您可以创建简单的函数,将包含多字节 UTF-8 字符的 — 转换为 std::string std::wstring 包含 UTF-166 编码点来自 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?

原文由 LihO 发布,翻译遵循 CC BY-SA 4.0 许可协议

@anhoppe 的 答案 的补充。以下是如何转换 char*

 #include <codecvt>
#include <locale>

// ...

std::wstring stringToWstring(const char* utf8Bytes)
{
    //setup converter
    using convert_type = std::codecvt_utf8<typename std::wstring::value_type>;
    std::wstring_convert<convert_type, typename std::wstring::value_type> converter;

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

以下是如何转换 char* 如果您也已经知道缓冲区的长度:

 #include <codecvt>

// ...

std::wstring stringToWstring(const char* utf8Bytes, const size_t numBytes)
{
    //setup converter
    using convert_type = std::codecvt_utf8<typename std::wstring::value_type>;
    std::wstring_convert<convert_type, typename std::wstring::value_type> converter;

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

原文由 Violet Giraffe 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题