如何转换 Platform::String 的内容以供需要基于 char* 字符串的函数使用?我假设 WinRT 为此提供了帮助函数,但我找不到它们。
谢谢!
如何转换 Platform::String 的内容以供需要基于 char* 字符串的函数使用?我假设 WinRT 为此提供了帮助函数,但我找不到它们。
谢谢!
这是在代码中执行此操作的一种非常简单的方法,无需担心缓冲区长度。仅当您确定要处理 ASCII 时才使用此解决方案:
Platform::String^ fooRT = "aoeu";
std::wstring fooW(fooRT->Begin());
std::string fooA(fooW.begin(), fooW.end());
const char* charStr = fooA.c_str();
请记住,在此示例中,char*
位于堆栈中,一旦离开范围就会消失
Platform::String::Data()
将返回一个wchar_t const*
指向字符串内容的指针(类似于std::wstring::c_str()
)。 Platform::String
表示一个不可变的字符串,因此没有访问器来获取wchar_t*
. 您需要复制其内容,例如复制到 中std::wstring
,以进行更改。
因为使用宽字符(所有 Metro 风格的应用程序都是 Unicode 应用程序),所以没有直接的方法来获得 achar*
或 a 。您可以使用.char const*
Platform::String
WideCharToMultiByte
您不应该将宽字符转换为字符,您将使用每个字符超过一个字节的语言来破坏语言,例如中文。这里是正确的方法。
#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();
有String::Data
方法返回const char16*
,它是原始的 unicode 字符串。
从 unicode 到 ascii 或其他什么的转换,即char16*
到char*
,是另一回事。您可能不需要它,因为现在大多数方法都有自己的wchar
版本。
使用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);