C ++でstd :: stringをLPCWSTRに変換する方法(Unicode)


114

std :: stringをLPCWSTRに変換するためのメソッドまたはコードスニペットを探しています


1
どのようにして逆を行うのですか?
Sohaib 2013年

私はグーグルから逆のことをやろうとしました。方法が見つかりませんでしたか?
トマーシュZato -復活モニカ

回答:


133

MSDN記事へのリンクをありがとう。これはまさに私が探していたものです。

std::wstring s2ws(const std::string& s)
{
    int len;
    int slength = (int)s.length() + 1;
    len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); 
    wchar_t* buf = new wchar_t[len];
    MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
    std::wstring r(buf);
    delete[] buf;
    return r;
}

std::wstring stemp = s2ws(myString);
LPCWSTR result = stemp.c_str();

4
(この質問がランダムに閲覧されていることがわかりました。C++を実行してから久しぶりです。)では、標準ライブラリにはstd :: string-> std :: wstring変換がありませんか?奇妙に思えます。正当な理由はありますか?
Domenic

5
std :: vector <wchar_t>を使用してbufのストレージを作成する場合、何かが例外をスローすると、一時バッファーが解放されます。
Jason Harrison

81
理由#233なぜc ++は私をひどく悩ませるのか単純な文字列変換のための10行のコード= /
b1nary.atr0phy

2
または、単にwstring ws(s.begin()、s.end())と言います...?
CJBrew

3
@CJBrew:すべての問題に対して、解決策があります。それは、クリーンでエレガントで間違っています。あなたの入力は、入力がASCII(ANSIではない)文字のみを保持するという仮定に基づいています。
IInspectable 2016年

121

解決策は実際には他のどの提案よりもはるかに簡単です。

std::wstring stemp = std::wstring(s.begin(), s.end());
LPCWSTR sw = stemp.c_str();

何よりも、プラットフォームに依存しません。h2h :)


2
ベニーさん、申し訳ありませんが、それは私にはうまくいきません。トランの独自の解決策はうまくいくように見えます(しかし、残念です!)。
Iain Collins

32
これは、すべての文字が1バイト、つまりASCIIまたはISO-8859-1の場合にのみ機能します。UTF-8を含め、マルチバイトのすべてが無残に失敗します。
Mark Ransom 2013

最初の行を次のように簡略化できると思います:std :: wstring stemp(s.begin()、s.end()); これにより、コピーの可能性がなくなり、見た目がシンプルになります。コンパイラとにかくコピーを削除する可能性がありますが、これは依然としてより単純な外観です。
キット10 2016年

13
主よ、すべての賛成票には何がありますか?この答えは、偶然だけでうまくいく場合もあります。文字エンコーディングは完全に無視されます。狭い文字を単純に広げることはできず、同じコードポイントを表すワイド文字に魔法のように変化することを期待できます。それはの道徳的同等物ですreinterpret_castこのコードは機能しません。使ってはいけません。
IInspectable 2016年

2
@nik:Windowsでは、a charは通常ANSIとしてエンコードされます。ANSIエンコーディングでは、128〜255の値は、現在アクティブなコードページを使用して解釈されます。それらの値をwchar_t(WindowsではUTF-16エンコード)に押し込むと、望ましい結果が得られません。正確にしたい場合、これはケースのちょうど50%で機能します。DBCS文字エンコードを考慮すると、その割合はさらに減少します。
IInspectable 2018年

9

ATL / MFC環境を使用している場合は、ATL変換マクロを使用できます。

#include <atlbase.h>
#include <atlconv.h>

. . .

string myStr("My string");
CA2W unicodeStr(myStr);

その後、unicodeStrをLPCWSTRとして使用できます。ユニコード文字列のメモリはスタック上に作成されて解放され、次にunicodeStrのデストラクタが実行されます。


0

std :: stringを使用する代わりに、std :: wstringを使用できます。

編集:申し訳ありませんが、これは説明ではありませんが、実行する必要があります。

std :: wstring :: c_str()を使用します


9
Q:「XからYに変換する必要があります。」- A:「ではなくX.の彼らがAを使用している仕事、探し」これは役に立たない。
IInspectable 2016年

すべての木のために森を見ることはできませんか?これは、私が探していたものとまったく同じように便利です
Charlie

-3
string  myMessage="helloworld";
int len;
int slength = (int)myMessage.length() + 1;
len = MultiByteToWideChar(CP_ACP, 0, myMessage.c_str(), slength, 0, 0); 
wchar_t* buf = new wchar_t[len];
MultiByteToWideChar(CP_ACP, 0, myMessage.c_str(), slength, buf, len);
std::wstring r(buf);
 std::wstring stemp = r.C_str();
LPCWSTR result = stemp.c_str();

-3

LPCWSTR lpcwName = std :: wstring(strname.begin()、strname.end())。c_str()


2
このソリューションは、すでにトップの答えの一つで9年前に提案された
ニノFiliu

1
そしてそれは今日それが間違っているのと同じくらい9年前に間違っていました。コメントは、なぜこれが狭い範囲のコード単位に対してのみ機能するかを説明しています。
IInspectable
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.