wstringを文字列に変換する方法は?


204

問題は、wstringをstringに変換する方法ですか?

次の例があります:

#include <string>
#include <iostream>

int main()
{
    std::wstring ws = L"Hello";
    std::string s( ws.begin(), ws.end() );

  //std::cout <<"std::string =     "<<s<<std::endl;
    std::wcout<<"std::wstring =    "<<ws<<std::endl;
    std::cout <<"std::string =     "<<s<<std::endl;
}

コメントアウトされた行の出力は次のとおりです。

std::string =     Hello
std::wstring =    Hello
std::string =     Hello

しかしなしは:

std::wstring =    Hello

例に何か問題がありますか?上記のように変換できますか?

編集

新しい例(いくつかの回答を考慮に入れる)は

#include <string>
#include <iostream>
#include <sstream>
#include <locale>

int main()
{
    setlocale(LC_CTYPE, "");

    const std::wstring ws = L"Hello";
    const std::string s( ws.begin(), ws.end() );

    std::cout<<"std::string =     "<<s<<std::endl;
    std::wcout<<"std::wstring =    "<<ws<<std::endl;

    std::stringstream ss;
    ss << ws.c_str();
    std::cout<<"std::stringstream =     "<<ss.str()<<std::endl;
}

出力は次のとおりです。

std::string =     Hello
std::wstring =    Hello
std::stringstream =     0x860283c

したがって、stringstreamを使用してwstringをstringに変換することはできません。


4
エンコーディングも指定せずにこの質問をするにはどうすればよいですか?
David Heffernan、2011年

5
@tenfour:なぜ使用std::wstringするのですか?stackoverflow.com/questions/1049947/...
dalle

11
@dalle UTF-16で既にエンコードされているデータがある場合、UTF-16が有害であると見なされているかどうかは、いくぶん疑わしいものです。そして、それだけの価値があるので、私はどんな変換形式も有害だとは思いません。有害なのは、実際には理解していないUnicodeを理解していると考える人々です。
David Heffernan、2011年

2
クロスプラットフォームソリューションである必要がありますか?
ali_bahoo

2
@dalle c ++標準では、utfについては一切言及されていません(utf-8またはutf-16)。utf-16がwstringでエンコードできない理由が記載されているリンクを入手しましたか?
BЈовић

回答:


31

他の提案に基づいた解決策は次のとおりです。

#include <string>
#include <iostream>
#include <clocale>
#include <locale>
#include <vector>

int main() {
  std::setlocale(LC_ALL, "");
  const std::wstring ws = L"ħëłlö";
  const std::locale locale("");
  typedef std::codecvt<wchar_t, char, std::mbstate_t> converter_type;
  const converter_type& converter = std::use_facet<converter_type>(locale);
  std::vector<char> to(ws.length() * converter.max_length());
  std::mbstate_t state;
  const wchar_t* from_next;
  char* to_next;
  const converter_type::result result = converter.out(state, ws.data(), ws.data() + ws.length(), from_next, &to[0], &to[0] + to.size(), to_next);
  if (result == converter_type::ok or result == converter_type::noconv) {
    const std::string s(&to[0], to_next);
    std::cout <<"std::string =     "<<s<<std::endl;
  }
}

これは通常Linuxで機能しますが、Windowsでは問題が発生します。


@Phillip:コードのどの部分がCロケールに依存していますか?されてstd::setlocale(LC_ALL, "");本当に必要?
smerlin

2
を使用std::wcout.imbue(locale)することも同様に機能し、グローバルな状態を変更しないという利点があります。
smerlin、2011年

32
std::wstring_convertこのノイズの多いアップC ++ 11のラップから。
Cubbi

7
@フィリップ、「Windowsで問題が発生する」とはどういう意味ですか?どんな問題?
ギリ

1
上記のコードは、(コピーしたまま)*** glibc detected *** test: malloc(): smallbin double linked list corrupted: 0x000000000180ea30 ***Linux 64ビット(gcc 4.7.3)を提供します。これを経験している人はいますか?
hogliux 2013年

312

Cubbiがコメントの1つで指摘したように、std::wstring_convert(C ++ 11)はきちんとしたシンプルなソリューションを提供します(#include <locale>およびが必要です<codecvt>)。

std::wstring string_to_convert;

//setup converter
using convert_type = std::codecvt_utf8<wchar_t>;
std::wstring_convert<convert_type, wchar_t> converter;

//use converter (.to_bytes: wstr->str, .from_bytes: str->wstr)
std::string converted_str = converter.to_bytes( string_to_convert );

私はwcstombsこれに遭遇する前に、メモリの組み合わせと退屈なメモリの割り当て/割り当て解除を使用していました。

http://en.cppreference.com/w/cpp/locale/wstring_convert

アップデート(2013.11.28)

1つのライナーはそのように記述できます(コメントをありがとうGuss):

std::wstring str = std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes("some string");

ラッパー関数は次のように記述することができます:(コメントをありがとうArmanSchwarz)

std::wstring s2ws(const std::string& str)
{
    using convert_typeX = std::codecvt_utf8<wchar_t>;
    std::wstring_convert<convert_typeX, wchar_t> converterX;

    return converterX.from_bytes(str);
}

std::string ws2s(const std::wstring& wstr)
{
    using convert_typeX = std::codecvt_utf8<wchar_t>;
    std::wstring_convert<convert_typeX, wchar_t> converterX;

    return converterX.to_bytes(wstr);
}

注:string/ wstringを参照として、またはリテラルとして(C ++ 11とコンパイラの更新により)関数に渡すかどうかについては、いくつかの論争があります。決定は実装者に任せますが、知っておく価値はあります。

注:私はstd::codecvt_utf8上記のコードで使用していますが、UTF-8を使用していない場合は、使用している適切なエンコーディングに変更する必要があります。

http://en.cppreference.com/w/cpp/header/codecvt


25
+1してください:これは文字列変換を行う公式のC ++標準の方法です。from_bytesを使用して別の方法で変換することもできます。私は個人的にワンライナーが好きなので、ここに私のバージョンがあります:std::wstring str = std::wstring_convert<std::codecvt_utf<wchar_t>>().from_bytes("some string");
Guss

7
以下のように見えるen.cppreference.com/w/cpp/header/codecvtは G ++ 4.8.2のとして使用することはできません。2つのs2wsメソッドとws2sメソッドは現在、Linuxでは機能しません
Begui

5
これは非推奨のようです(stackoverflow.com/a/42946556/211176)。このコードを実行しようとすると、コンパイラーがエラーをスローします
adam_0


5
C ++ 17とさらなる互換性(非推奨のため)を心配している人は、次を参照してください:stackoverflow.com/a/18597384/6205379
Timo

128

解決策:http : //forums.devshed.com/c-programming-42/wstring-to-string-444006.html

std::wstring wide( L"Wide" ); 
std::string str( wide.begin(), wide.end() );

// Will print no problemo!
std::cout << str << std::endl;

ここでは文字セット変換がまったく行われていないことに注意しください。これが行うことは、単に各反復wchar_tchar-切り捨て変換に割り当てることです。std :: string c'torを使用します

template< class InputIt >
basic_string( InputIt first, InputIt last,
              const Allocator& alloc = Allocator() );

コメントで述べたように:

値0〜127は事実上すべてのエンコーディングで同一であるため、すべて127未満の値を切り捨てると同じテキストになります。漢字を入力すると、失敗が表示されます。

-

Windowsコードページ1252(Windows英語のデフォルト)の値128〜255とユニコードの値128〜255はほとんど同じであるため、コードページである場合、それらの文字のほとんどを使用している場合は、正しい値に切り捨てる必要があります。(私はáとõが動作することを完全に期待していました。動作中のコードがéのためにこれに依存していることを知っています。これはすぐに修正されます)

また0x80 - 0x9FWin1252の範囲内のコードポイントは機能しません。これにはœžŸ、...


2
奇妙なことに、これはVisual Studio 10で機能します。これにより、元の文字列のすべての要素について、wchar_tからcharへの割り当てが切り捨てられます。
PedroLamarão2013年

6
...それが非ラテン文字に行くとき。
JavaRunner 2013年

8
@PedroLamarão:値0〜127は事実上すべてのエンコーディングで同一であるため、すべて127未満の値を切り捨てると同じテキストになります。漢字を入力すると、失敗が表示されます。
Mooing Duck 2013

3
@PedroLamarão:Windowsコードページ1252(Windows英語のデフォルト)の値128-255とUnicodeの値128-255はほとんど同じであるため、使用しているコードページがほとんどの場合、これらの文字のほとんどは正しいものに切り捨てられます。値。(I仕事とは全く予想AとO、私は仕事で私たちのコードは、私はすぐに修正されますされ、Eの本に頼っている知っている)
ダックMooing

2
これはうまくいきます。MSVS 2015およびMSVS 2017およびMINGW / g ++およびclang ++。合法++ 1。
ニコス

11

ロケールとそのすべての凝ったものを含める代わりに、FACTで文字列が変換可能であることがわかっている場合は、次のようにします。

#include <iostream>
#include <string>

using namespace std;

int main()
{
  wstring w(L"bla");
  string result;
  for(char x : w)
    result += x;

  cout << result << '\n';
}

ここでライブ例


2
+1は、いくつかのシナリオで機能する単純なソリューションであるためです(「機能」の大まかな定義については、追加する場合があります)。
レイヴン2012

2
namar0x0309のソリューションとほぼ同じで、はるかにエレガントなIMHOです。しかし、それは私だけです。
鬼竹2013年

最小限の変更で実際に機能するようにコードを書き直しました;-)
rubenvb '22

9
-1 wstringがある場合、マルチバイト文字を処理している可能性があります。文字列が自明に変換可能であることがわかった場合、そもそもwstringを処理することはできません。より可能性が高いのは、wstringを適切に処理することを期待する別のライブラリーを扱っている場合です。wcharを切り捨てることは、後で追跡するのが難しいバグを求めているだけです。また、「string result(w.begin()、w.end());」を使用する必要があります。多くの再割り当てをトリガーする可能性のあるループを回避するために、それを行う場合。
キアン2014年

7

次のように、公式な方法はまだ徹底的なcodecvtファセット(ある種のロケール対応の翻訳が必要です)に進むことだと思います

resultCode = use_facet<codecvt<char, wchar_t, ConversionState> >(locale).
  in(stateVar, scratchbuffer, scratchbufferEnd, from, to, toLimit, curPtr);

またはそのような何か、私はうそをつく作業コードを持っていません。しかし、最近その機械を何人使用し、どれだけ単純にメモリへのポインタを要求し、ICUや他のライブラリに細かい部分を処理させるかはわかりません。


7

コードには2つの問題があります。

  1. const std::string s( ws.begin(), ws.end() );ワイド文字を対応するナロー文字に正しくマッピングするための変換は必要ありません。ほとんどの場合、各ワイド文字は単にに型キャストされcharます。
    この問題の解決策は、kemによる回答ですでに提供されておりnarrow、ロケールのctypeファセットの機能が関係しています。

  2. あなたは両方に出力を書いているstd::coutし、std::wcout同じプログラムで。coutwcoutはどちらも同じストリーム(stdout)に関連付けられており、同じストリームをバイト指向ストリーム(asとしてcout)とワイド指向ストリーム(asとしてwcout)の両方として使用した結果は定義されていません。
    最良のオプションは、ナロー出力とワイド出力が同じ(基礎となる)ストリームに混在しないようにすることです。stdout/ cout/ については、ワイド出力とナロー出力を切り替えるときにwcout方向を切り替えてみてくださいstdout(またはその逆)。

    #include <iostream>
    #include <stdio.h>
    #include <wchar.h>
    
    int main() {
        std::cout << "narrow" << std::endl;
        fwide(stdout, 1); // switch to wide
        std::wcout << L"wide" << std::endl;
        fwide(stdout, -1); // switch to narrow
        std::cout << "narrow" << std::endl;
        fwide(stdout, 1); // switch to wide
        std::wcout << L"wide" << std::endl;
    }

はい、それはcoutとwcoutの使用に関する問題を修正します。
BЈовић

7

デフォルトのエンコーディング:

  • Windows UTF-16。
  • Linux UTF-8。
  • MacOS UTF-8。

このコードには、std :: stringをstd :: wstringに、およびstd :: wstringをstd :: stringに変換する2つの形式があります。#if defined WIN32を否定しても、同じ結果が得られます。

1. std :: stringからstd :: wstringへ

MultiByteToWideChar WinAPI

_mbstowcs_s_l

#if defined WIN32
#include <windows.h>
#endif

std::wstring StringToWideString(std::string str)
{
    if (str.empty())
    {
        return std::wstring();
    }
    size_t len = str.length() + 1;
    std::wstring ret = std::wstring(len, 0);
#if defined WIN32
    int size = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, &str[0], str.size(), &ret[0], len);
    ret.resize(size);
#else
    size_t size = 0;
    _locale_t lc = _create_locale(LC_ALL, "en_US.UTF-8");
    errno_t retval = _mbstowcs_s_l(&size, &ret[0], len, &str[0], _TRUNCATE, lc);
    _free_locale(lc);
    ret.resize(size - 1);
#endif
    return ret;
}

2. std :: wstringからstd :: stringへ

WideCharToMultiByte WinAPI

_wcstombs_s_l

std::string WidestringToString(std::wstring wstr)
{
    if (wstr.empty())
    {
        return std::string();
    }
#if defined WIN32
    int size = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, &wstr[0], wstr.size(), NULL, 0, NULL, NULL);
    std::string ret = std::string(size, 0);
    WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, &wstr[0], wstr.size(), &ret[0], size, NULL, NULL);
#else
    size_t size = 0;
    _locale_t lc = _create_locale(LC_ALL, "en_US.UTF-8");
    errno_t err = _wcstombs_s_l(&size, NULL, 0, &wstr[0], _TRUNCATE, lc);
    std::string ret = std::string(size, 0);
    err = _wcstombs_s_l(&size, &ret[0], size, &wstr[0], _TRUNCATE, lc);
    _free_locale(lc);
    ret.resize(size - 1);
#endif
    return ret;
}

3. Windowsでは、WinAPIを使用してUnicodeを印刷する必要があります。

WriteConsole

#if defined _WIN32
    void WriteLineUnicode(std::string s)
    {
        std::wstring unicode = StringToWideString(s);
        WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), unicode.c_str(), unicode.length(), NULL, NULL);
        std::cout << std::endl;
    }

    void WriteUnicode(std::string s)
    {
        std::wstring unicode = StringToWideString(s);
        WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), unicode.c_str(), unicode.length(), NULL, NULL);
    }

    void WriteLineUnicode(std::wstring ws)
    {
        WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), ws.c_str(), ws.length(), NULL, NULL);
        std::cout << std::endl;
    }

    void WriteUnicode(std::wstring ws)
    {
        WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), ws.c_str(), ws.length(), NULL, NULL);
    }

4.メインプログラム。

#if defined _WIN32
int wmain(int argc, WCHAR ** args)
#else
int main(int argc, CHAR ** args)
#endif
{
    std::string source = u8"ÜüΩωЙ你月曜日\na🐕èéøÞǽлљΣæča🐕🐕";
    std::wstring wsource = L"ÜüΩωЙ你月曜日\na🐕èéøÞǽлљΣæča🐕🐕";

    WriteLineUnicode(L"@" + StringToWideString(source) + L"@");
    WriteLineUnicode("@" + WidestringToString(wsource) + "@");
    return EXIT_SUCCESS;
}

5.最後に、コンソールでのユニコード文字の強力で完全なサポートが必要です。 私はConEmuをお勧めし、Windowsのデフォルトの端末として設定します。Visual StudioをConEmuにフックする必要があります。Visual Studioのexeファイルはdevenv.exeです。

Visual Studio 2017とVC ++でテスト済み。std = c ++ 17。

結果

結果1


6

ctypeファセットのナローメソッドを直接使用することもできます。

#include <clocale>
#include <ロケール>
#include <string>
#include <vector>

インラインstd :: stringナロー(std :: wstring const&text)
{
    std :: locale const loc( "");
    wchar_t const * from = text.c_str();
    std :: size_t const len = text.size();
    std :: vector <char> buffer(len + 1);
    std :: use_facet <std :: ctype <wchar_t>>(loc).narrow(from、from + len、 '_'、&buffer [0]);
    std :: string(&buffer [0]、&buffer [len]);を返します。
}

6

この回答を書いている時点では、「文字列を変換する」というグーグル検索でナンバーワンになると、このページが表示されます。私の答えは、文字列をwstringに変換する方法を示していますが、これは実際の質問ではありません。おそらく、この答えは削除する必要がありますが、これは不適切な形式と見なされます。このページより上位にランク付けさ れたこのStackOverflowの回答にジャンプすることもできます。


これは、文字列、wstring、および混合文字列定数をwstringに組み合わせる方法です。wstringstreamクラスを使用します。

#include <sstream>

std::string narrow = "narrow";
std::wstring wide = "wide";

std::wstringstream cls;
cls << " abc " << narrow.c_str() << L" def " << wide.c_str();
std::wstring total= cls.str();

13
これはwstringから文字列への変換ではありません
poitroae

1
@マイケル説明して頂けますか?これはどうですか?あなたのコメントは詳細がなければ役に立ちません。
2012年

1
これは文字列からwstringへの変換です。つまり、質問の反対です。
ジェフマクリントック2017

4

タイプを変換するだけでなく、文字列の実際の形式についても意識する必要があります。

マルチバイト文字セット用にコンパイルする場合、Visual StudioおよびWin APIはUTF8(実際にはWindowsエンコードであるWindows-28591)を想定しています。Unicode文字セットを
コンパイルする場合、Visual StudioとWin APIはUTF16を想定しています。

したがって、std :: stringに変換するだけでなく、文字列をUTF16からUTF8形式に変換する必要があります。
これは、一部の非ラテン言語のような複数文字形式で作業するときに必要になります。

アイデアは、std::wstring 常にUTF16 表すことを決定することです。
そして、std::string 常にUTF8 表します。

これはコンパイラーによって強制されるのではなく、より良いポリシーです。UTF16(L)およびUTF8(u8)を定義するために使用する文字列プレフィックスに注意してください。

2つのタイプ間で変換するには、次を使用する必要があります。std :: codecvt_utf8_utf16 <wchar_t>

#include <string>

#include <codecvt>

int main()
{

    std::string original8 = u8"הלו";

    std::wstring original16 = L"הלו";

    //C++11 format converter
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;

    //convert to UTF8 and std::string
    std::string utf8NativeString = convert.to_bytes(original16);

    std::wstring utf16NativeString = convert.from_bytes(original8);

    assert(utf8NativeString == original8);
    assert(utf16NativeString == original16);

    return 0;
}

3

私の場合、マルチバイト文字(MBCS)を使用する必要があり、std :: stringとstd :: wstringを使用したいと思います。また、c ++ 11は使用できません。したがって、mbstowcsとwcstombsを使用します。

私はnew、delete []を使用して同じ機能を作成しますが、これよりも遅くなります。

これは、方法:さまざまな文字列型間の変換に役立ちます

編集

ただし、wstringに変換し、ソース文字列がアルファベットおよびマルチバイト文字列でない場合、機能しません。そこで、wcstombsをWideCharToMultiByteに変更します。

#include <string>

std::wstring get_wstr_from_sz(const char* psz)
{
    //I think it's enough to my case
    wchar_t buf[0x400];
    wchar_t *pbuf = buf;
    size_t len = strlen(psz) + 1;

    if (len >= sizeof(buf) / sizeof(wchar_t))
    {
        pbuf = L"error";
    }
    else
    {
        size_t converted;
        mbstowcs_s(&converted, buf, psz, _TRUNCATE);
    }

    return std::wstring(pbuf);
}

std::string get_string_from_wsz(const wchar_t* pwsz)
{
    char buf[0x400];
    char *pbuf = buf;
    size_t len = wcslen(pwsz)*2 + 1;

    if (len >= sizeof(buf))
    {
        pbuf = "error";
    }
    else
    {
        size_t converted;
        wcstombs_s(&converted, buf, pwsz, _TRUNCATE);
    }

    return std::string(pbuf);
}

「wcstombs」の代わりに「MultiByteToWideChar」を使用するように編集します

#include <Windows.h>
#include <boost/shared_ptr.hpp>
#include "string_util.h"

std::wstring get_wstring_from_sz(const char* psz)
{
    int res;
    wchar_t buf[0x400];
    wchar_t *pbuf = buf;
    boost::shared_ptr<wchar_t[]> shared_pbuf;

    res = MultiByteToWideChar(CP_ACP, 0, psz, -1, buf, sizeof(buf)/sizeof(wchar_t));

    if (0 == res && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
    {
        res = MultiByteToWideChar(CP_ACP, 0, psz, -1, NULL, 0);

        shared_pbuf = boost::shared_ptr<wchar_t[]>(new wchar_t[res]);

        pbuf = shared_pbuf.get();

        res = MultiByteToWideChar(CP_ACP, 0, psz, -1, pbuf, res);
    }
    else if (0 == res)
    {
        pbuf = L"error";
    }

    return std::wstring(pbuf);
}

std::string get_string_from_wcs(const wchar_t* pcs)
{
    int res;
    char buf[0x400];
    char* pbuf = buf;
    boost::shared_ptr<char[]> shared_pbuf;

    res = WideCharToMultiByte(CP_ACP, 0, pcs, -1, buf, sizeof(buf), NULL, NULL);

    if (0 == res && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
    {
        res = WideCharToMultiByte(CP_ACP, 0, pcs, -1, NULL, 0, NULL, NULL);

        shared_pbuf = boost::shared_ptr<char[]>(new char[res]);

        pbuf = shared_pbuf.get();

        res = WideCharToMultiByte(CP_ACP, 0, pcs, -1, pbuf, res, NULL, NULL);
    }
    else if (0 == res)
    {
        pbuf = "error";
    }

    return std::string(pbuf);
}

gcc 4.8で「wcstombs_s」を使用するにはどうすればよいですか?それはC ++ 11の機能だと思います。
クリスティアン2016年

@cristianこの関数の「安全でない」バージョンを使用できますwcstombs()
Vizor 2017年

3

このソリューションは、dk123のソリューションに着想を得ていますが、ロケール依存のcodecvtファセットを使用しています。結果は、UTF-8ではなくロケールでエンコードされた文字列になります(ロケールとして設定されていない場合)。

std::string w2s(const std::wstring &var)
{
   static std::locale loc("");
   auto &facet = std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t>>(loc);
   return std::wstring_convert<std::remove_reference<decltype(facet)>::type, wchar_t>(&facet).to_bytes(var);
}

std::wstring s2w(const std::string &var)
{
   static std::locale loc("");
   auto &facet = std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t>>(loc);
   return std::wstring_convert<std::remove_reference<decltype(facet)>::type, wchar_t>(&facet).from_bytes(var);
}

探していましたが見つかりません。最後に、正しいタイプ名で関数をstd::locale使用することで正しいファセットを取得できることがわかりましたstd::use_facet()。お役に立てれば。


Vizor、ロケールに依存するファセットで変換することの利点(ある場合)は何ですか?
Marc.2377

システムからの文字列、たとえばコンソール入力から作業する場合。
Vizor

1

他の誰かが興味を持っている場合:私は、stringまたはwstring予想された場所で交換可能に使用できるクラスが必要でした。以下のクラスconvertible_stringに基づいて、dk123のソリューションは、どちらかで初期化することができstringchar const*wstringまたはwchar_t const*とによってに割り当てられたまたは暗黙のいずれかに変換できるstringwstring(そのどちらか取る関数に渡すことができます)。

class convertible_string
{
public:
    // default ctor
    convertible_string()
    {}

    /* conversion ctors */
    convertible_string(std::string const& value) : value_(value)
    {}
    convertible_string(char const* val_array) : value_(val_array)
    {}
    convertible_string(std::wstring const& wvalue) : value_(ws2s(wvalue))
    {}
    convertible_string(wchar_t const* wval_array) : value_(ws2s(std::wstring(wval_array)))
    {}

    /* assignment operators */
    convertible_string& operator=(std::string const& value)
    {
        value_ = value;
        return *this;
    }
    convertible_string& operator=(std::wstring const& wvalue)
    {
        value_ = ws2s(wvalue);
        return *this;
    }

    /* implicit conversion operators */
    operator std::string() const { return value_; }
    operator std::wstring() const { return s2ws(value_); }
private:
    std::string value_;
};

1
を取得するために必要なときstd::wstringに格納std::stringして変換するのではなく、クラスにを格納したい。何よりも高速で、互換性が高いためです。それよりも多くのメモリを消費します。std::wstringstd::wstringstd::wstringstd::stringstd::string
0xAA55

0
#include <boost/locale.hpp>
namespace lcv = boost::locale::conv;

inline std::wstring fromUTF8(const std::string& s)
{ return lcv::utf_to_utf<wchar_t>(s); }

inline std::string toUTF8(const std::wstring& ws)
{ return lcv::utf_to_utf<char>(ws); }

-1

以下を使用してwstringをstringに変換しています。

std::string strTo;
char *szTo = new char[someParam.length() + 1];
szTo[someParam.size()] = '\0';
WideCharToMultiByte(CP_ACP, 0, someParam.c_str(), -1, szTo, (int)someParam.length(), NULL, NULL);
strTo = szTo;
delete szTo;

あなたは標準的なヘッダー(<string>)と定義が欠落しているようですWideCharToMultiByte()-それはいくつかのラッパーstd::wctomb()ですか?
Toby Speight

-3
// Embarcadero C++ Builder 

// convertion string to wstring
string str1 = "hello";
String str2 = str1;         // typedef UnicodeString String;   -> str2 contains now u"hello";

// convertion wstring to string
String str2 = u"hello";
string str1 = UTF8string(str2).c_str();   // -> str1 contains now "hello"

3
回答でそこで何をしているのかを説明してください。そうしないと、削除される可能性があります
CodeFanatic 2014

1
UTF8string関数はどこから来たのですか?
Jean-Christophe Blanchard
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.