web-dev-qa-db-ja.com

Platform :: Stringをchar *に変換する方法は?

Platform :: Stringの内容を、char *ベースの文字列を期待する関数で使用するように変換するにはどうすればよいですか? WinRTがこのためのヘルパー関数を提供していると思いますが、それらが見つかりません。

ありがとう!

18
djcouchycouch

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を使用してマルチバイトに変換できます。

13
James McNellis

これは、バッファの長さを気にすることなく、コードでこれを行う非常に簡単な方法です。 ASCIIを扱っていることが確実な場合にのみ、このソリューションを使用してください

Platform::String^ fooRT = "aoeu";
std::wstring fooW(fooRT->Begin());
std::string fooA(fooW.begin(), fooW.end());
const char* charStr = fooA.c_str();

この例では、char*はスタック上にあり、スコープを離れると消えます

13
rysama

ワイド文字を文字にキャストしないでください。文字ごとに複数のバイトを使用して言語をマングルします。中国語。正しい方法は次のとおりです。

#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();
5
Jeff McClintock

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);
1
Sistr

生のUnicode文字列であるString::Dataを返すconst char16*メソッドがあります。

UnicodeからASCIIなどへの変換、つまりchar16*からchar*への変換は別の問題です。最近のほとんどのメソッドにはwcharバージョンがあるため、おそらく必要ありません。

1
Qnan