C++ 将常量字符*转换为wstring

C++ 将常量字符*转换为wstring,c++,C++,我正在为基于锌的flash应用程序开发本机扩展,需要将const char*转换为wstring 这是我的代码: mdmVariant_t* appendHexDataToFile(const zinc4CallInfo_t *pCallInfo, int paramCount, mdmVariant_t **params) { if(paramCount >= 2) { const char *file = mdmVariantGetString(para

我正在为基于锌的flash应用程序开发本机扩展,需要将
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

我找到了一个代码

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的第二个解决方案:


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

一旦有了
std::string
,就可以创建简单的函数,将包含多字节UTF-8字符的
std::string
转换为包含UTF-16编码点的
std::string
(来自
std::string
的特殊字符的16位表示形式)

有更多方法可以做到这一点,以下是使用以下方法:

也检查这些问题:


您需要一个可以对UTF8进行编码/解码的库。不幸的是,这个功能不包括在STD C++库中。这里有一个您可以使用的库:

下面是它的一个使用示例:

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

在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)};
}
#包括
#包括
//通过给面一个公共析构函数使其可用
模板
类可用的切面
:公共方面
{
公众:
模板
可用面(Args&&…Args)
:Facet(std::forward(args)…{}
~u facet(){}
};
std::wstring s2ws(std::string const&s){
std::wstring\u转换<
可用面
,char32_t>转换;
std::u32string utf32=从字节转换而来;
静态断言(sizeof(wchar_t)=sizeof(char32_t),“char32_t和wchar_t必须具有相同的大小”);
返回{开始(utf32),结束(utf32)};
}

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);
}
#包括
// ...
std::wstring stringToWstring(const std::string&t_str)
{
//设置转换器
typedef std::codevt_utf8 convert_type;
std::wstring_转换器;
//使用转换器(.to_字节:wstr->str,.from_字节:str->wstr)
从_字节返回转换器(t_str);
}

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

char buf1[] = "12345678901234567890";
wstring ws(&buf1[0], &buf1[20]);
来自@anhoppe的对。下面是如何转换字符*:

#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和wide char之前,您应该能够回答以下问题:字符串是如何编码的,您打算进行什么转换?除了@ereOn之外,您使用的是哪种平台格式?如果传递给此函数的std::string包含需要转换为UTF-16编码宽字符等价物的多字节字符怎么办?为什么不使用“”?无论如何,复制功能都会将其擦除。这只是一个为字符串腾出空间的任意字符。那么,当您知道这些字符将被重写时,为什么要将它们初始化为
'
?因为复制函数不创建缓冲区。首先需要创建缓冲区,这是由构造函数完成的。啊,对不起,我现在看到了。我认为它还有一个构造函数,只接受
size\u type count
,就像
std::vector
一样。免责声明:
MultiByteToWideChar
是一个仅用于Windows的函数。(OP正在使用Windows,但问题仅标记为
c++
)如果您的解决方案是跨平台的,那就最好了。@华新68这仍然是Windows上最好的转换。正如MS所说,“您的应用程序可以使用标准的C运行时库函数在Windows代码页和OEM代码页之间进行转换。但是,使用这些函数存在数据丢失的风险,因为每个代码页可以表示的字符不完全匹配。”,我想知道在转换通过WINAPI…A()函数(例如,从GetWindowTextA)获得的字符串时,是否应该使用CP_ACP代码页在C++中被弃用17@EnricoDetoma什么是不推荐的?std::wstring_convert在没有包含的情况下不可用#至少包含在我的Ubuntu框中std::wstring_convert在没有包含的情况下不可用#至少包含在我的Ubuntu框中
#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);
}
#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);
}