特定の問題に対する答えは、提供されている両方の良い答えにあります。質問のタイトルは単にだったので、関数なしwstring::c_str() contains garbage
で正しい結果を得る方法を指摘します。decode
Microsoft は、ワイド文字 (Unicode) と MBCS (Ascii) の間で変換するための多数のATL変換マクロとクラスを追加しました。それらは VS2008 で利用できます。サポートされている変換は、 MSDN ドキュメントで見つけることができます。
ATL 7.0 では、いくつかの新しい変換クラスとマクロが導入され、既存のマクロが大幅に改善されています。新しい文字列変換クラスとマクロの名前は、
C SourceType 2 [C]DestinationType[EX] の形式を取ります。
[をちょきちょきと切る]
SourceType/DestinationType
A = ANSI 文字列。
W = Unicode 文字列。
T = 汎用文字列 (_UNICODE が定義されている場合は W と同等、そうでない場合は A と同等)。
OLE = OLE 文字列 (W に相当)。
これ[EX]
はオプションであり、マクロで使用されるデフォルトの内部バッファーのサイズを指定したくない場合によく使用されます。
あなたの場合、変換マクロCA2W
(AsciiをWidecharに変換する)はあなたが望むことをするはずです。#include <atlbase.h>
それらを使用するだけです。これらのマクロは、変換する文字列とコード ページの 2 つのパラメータを受け取ります (指定されていない場合、デフォルトは CP_ACP になります)。
あなたの場合、あなたは持っていました:
std::wstring res = decode(src);
const wchar_t *result = res.c_str();
ATL 変換マクロを使用すると、次のように実行できます。
std::wstring res = CA2W(src, CP_ACP);
const wchar_t *result = res.c_str();
マクロのデフォルトは Ansi Code Page であるため、次のように CP_ACP をオフにすることもできます。
std::wstring res = CA2W(src);
const wchar_t *result = res.c_str();
一時オブジェクトの問題に関しては、これらのマクロによって返されるクラスにも同じことが当てはまります。Microsoft は、以前に提供されたリンクで、この問題を誤った使用例で文書化しています。
// Example 3
// Incorrect use of conversion macros.
void ExampleFunction3(LPCWSTR pszW)
{
// Create a temporary instance of CW2A,
// save a pointer to it and then delete
// the temportary instance.
LPCSTR pszA = CW2A(pszW);
// The pszA in the following line is an invalid pointer,
// as the instance of CW2A has gone out of scope.
ExampleFunctionA(pszA);
}