【发布时间】:2012-07-29 13:49:12
【问题描述】:
如何转换 Platform::String 的内容以供需要基于 char* 字符串的函数使用?我假设 WinRT 为此提供了帮助函数,但我找不到它们。
谢谢!
【问题讨论】:
-
您不能要求从 UTF-16LE 进行转换,除非您指定目标字符编码。这是什么?
标签: c++ character-encoding microsoft-metro windows-runtime c++-cx
如何转换 Platform::String 的内容以供需要基于 char* 字符串的函数使用?我假设 WinRT 为此提供了帮助函数,但我找不到它们。
谢谢!
【问题讨论】:
标签: c++ character-encoding microsoft-metro windows-runtime c++-cx
这是在代码中执行此操作的一种非常简单的方法,无需担心缓冲区长度。 只有在您确定要处理 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,进行更改。
没有直接方法可以获取char* 或char const*,因为Platform::String 使用宽字符(所有 Metro 风格的应用程序都是 Unicode 应用程序)。您可以使用WideCharToMultiByte 转换为多字节。
【讨论】:
WideCharToMultiByte 可从 Metro 风格应用程序调用。
String 是不可变的,为什么String::Begin 返回char16 * 而不是char16 const*?使用这个指针修改单个字符是否合法?
Begin() 和 End() 都返回 char16 const*。您可以在<vccorlib.h> 中查看它们的定义。您可能不会修改指向的字符(字符串是引用计数的,如果有其他所有者并且您修改了字符串,那么其他所有者会非常惊讶地发现他们的字符串已更改)。我会看看我能做些什么来修复文档。感谢您的提醒。
您不应该将宽字符转换为 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();
【讨论】:
char* raw = std::wstring_convert<std::codecvt_utf8<wchar_t>>().to_bytes(fooRT->Data()).c_str();
raw 变量将指向释放的内存(在计算表达式后临时对象消失),如果按字面意思使用的话。除非您确定自己在做什么,否则最好使用std::string utf8 = std::wstring_convert<std::codecvt_utf8<wchar_t>>().to_bytes(fooRT->Data())。
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);
【讨论】: