34

私は亜鉛ベースのフラッシュアプ​​リケーションのネイティブ拡張に取り組んでおり、をに変換する必要があり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()2つ必要wstringです。私はC++があまり得意ではなく、これらのさまざまな文字列タイプはすべて完全に混乱していると思います。ネットで役立つものは見つかりませんでした。だから私はあなたたちにそれを行う方法を尋ねています。

編集:文字列はUTF-8で、OSXとWindows XP / Vista/7を使用しています

4

7 に答える 7

23

可能な限りstd::string、Cスタイルの文字列()の代わりに使用することをお勧めします。オブジェクトをコンストラクターに渡すだけで、からオブジェクトchar*を作成できます。std::stringconst char*

を取得したら、マルチバイトUTF-8文字を含むものをUTF-16エンコードポイント(からの特殊文字の16ビット表現)を含むstd::stringものに変換する単純な関数を作成できます。std::stringstd::wstringstd::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に変換するのはなぜですか?

于 2012-05-24T13:09:28.733 に答える
16

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);
}

参考回答

アップデート

コメントに示されているように、<codecvt>はC++17では非推奨になっているようです。ここを参照してください:非推奨のヘッダー<codecvt>の置換

于 2015-09-21T14:00:30.770 に答える
16

次のコードのように、char文字列を直接変換できます。wstring

char buf1[] = "12345678901234567890";
wstring ws(&buf1[0], &buf1[20]);
于 2016-09-15T21:35:53.093 に答える
2

UTF8をエンコード/デコードできるライブラリが必要です。残念ながら、この機能はstdc++ライブラリには含まれていません。使用する可能性のあるライブラリが1つあります:http://utfcpp.sourceforge.net/

使用例を次に示します。

utf8::utf8to32(bytes.begin(), bytes.end(), std::back_inserter(wstr));
于 2012-05-24T13:14:00.430 に答える
0

OS Xでは、wstringはUTF-16ではなくUTF-32を使用します。次のように変換を行うことができます。

#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)};
}
于 2012-05-24T14:12:03.840 に答える
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);
}
于 2018-06-28T07:46:09.733 に答える
-2

これが私が見つけたコードです。

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

そして、これがWindowsAPI関数MultiByteToWideCharを使用した2番目の解決策の可能性がある元のフォーラム投稿です。

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

于 2012-05-24T12:43:41.743 に答える