18

如何转换 Platform::String 的内容以供需要基于 char* 字符串的函数使用?我假设 WinRT 为此提供了帮助函数,但我找不到它们。

谢谢!

4

5 回答 5

14

这是在代码中执行此操作的一种非常简单的方法,无需担心缓冲区长度。仅当您确定要处理 ASCII 时才使用此解决方案

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

请记住,在此示例中,char*位于堆栈中,一旦离开范围就会消失

于 2013-04-12T20:36:20.503 回答
13

Platform::String::Data()将返回一个wchar_t const*指向字符串内容的指针(类似于std::wstring::c_str())。 Platform::String表示一个不可变的字符串,因此没有访问器来获取wchar_t*. 您需要复制其内容,例如复制到 中std::wstring,以进行更改。

因为使用宽字符(所有 Metro 风格的应用程序都是 Unicode 应用程序),所以没有直接的方法来获得 achar*或 a 。您可以使用.char const*Platform::StringWideCharToMultiByte

于 2012-07-31T18:01:27.507 回答
6

您不应该将宽字符转换为字符,您将使用每个字符超过一个字节的语言来破坏语言,例如中文。这里是正确的方法。

#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();
于 2015-09-11T04:03:22.580 回答
1

String::Data方法返回const char16*,它是原始的 unicode 字符串。

从 unicode 到 ascii 或其他什么的转换,即char16*char*,是另一回事。您可能不需要它,因为现在大多数方法都有自己的wchar版本。

于 2012-07-31T18:00:54.603 回答
1

使用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);
于 2013-11-14T11:09:09.570 回答