Platform :: Stringの内容を、char *ベースの文字列を期待する関数で使用するように変換するにはどうすればよいですか? WinRTがこのためのヘルパー関数を提供していると思いますが、それらが見つかりません。
ありがとう!
Platform::String::Data()
は、文字列の内容を指す_wchar_t const*
_を返します(std::wstring::c_str()
と同様)。 _Platform::String
_は不変の文字列を表すため、_wchar_t*
_を取得するためのアクセサーはありません。その内容をコピーする必要があります。 _std::wstring
_に変更します。
_char*
_はワイド文字を使用するため、direct _char const*
_または_Platform::String
_を取得する方法はありません(MetroスタイルのアプリはすべてUnicodeアプリです)。 WideCharToMultiByte
を使用してマルチバイトに変換できます。
これは、バッファの長さを気にすることなく、コードでこれを行う非常に簡単な方法です。 ASCIIを扱っていることが確実な場合にのみ、このソリューションを使用してください:
Platform::String^ fooRT = "aoeu";
std::wstring fooW(fooRT->Begin());
std::string fooA(fooW.begin(), fooW.end());
const char* charStr = fooA.c_str();
この例では、char*
はスタック上にあり、スコープを離れると消えます
ワイド文字を文字にキャストしないでください。文字ごとに複数のバイトを使用して言語をマングルします。中国語。正しい方法は次のとおりです。
#include <cvt/wstring>
#include <codecvt>
Platform::String^ fooRT = "foo";
stdext::cvt::wstring_convert<std::codecvt_utf8<wchar_t>> convert;
std::string stringUtf8 = convert.to_bytes(fooRT->Data());
const char* rawCstring = stringUtf8.c_str();
wcstombs を使用したソリューション:
Platform::String^ platform_string = p_e->Uri->AbsoluteUri;
const wchar_t* wide_chars = platform_string->Data();
char chars[512];
wcstombs(chars, wide_chars, 512);
生のUnicode文字列であるString::Data
を返すconst char16*
メソッドがあります。
UnicodeからASCIIなどへの変換、つまりchar16*
からchar*
への変換は別の問題です。最近のほとんどのメソッドにはwchar
バージョンがあるため、おそらく必要ありません。