【问题标题】:How to convert Platform::String to char*?如何将 Platform::String 转换为 char*?
【发布时间】:2012-07-29 13:49:12
【问题描述】:

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

谢谢!

【问题讨论】:

  • 您不能要求从 UTF-16LE 进行转换,除非您指定目标字符编码。这是什么?

标签: c++ character-encoding microsoft-metro windows-runtime c++-cx


【解决方案1】:

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

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

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

【讨论】:

  • 对于每一个问题,都有一个解决方案,简单、优雅。并且错了。像这个。任何超出 ASCII 字符范围的字符都将被随机表示,具体取决于执行线程的当前状态。 不要使用这个解决方案。(这很简单,因为它甚至不编译。)
  • 修复了编译器错误。 PS:如果 100% 确定您只需要处理 ASCII 字符,这仍然是一种很好的转换方式
【解决方案2】:

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

没有直接方法可以获取char*char const*,因为Platform::String 使用宽字符(所有 Metro 风格的应用程序都是 Unicode 应用程序)。您可以使用WideCharToMultiByte 转换为多字节。

【讨论】:

  • 是否有任何特定于 Metro 的“间接”转换为 char* 的方法?
  • WideCharToMultiByte 可从 Metro 风格应用程序调用。
  • @JamesMcNellis 如果String 是不可变的,为什么String::Begin 返回char16 * 而不是char16 const*?使用这个指针修改单个字符是否合法?
  • @Prætorian:文档有误。 Begin()End() 都返回 char16 const*。您可以在<vccorlib.h> 中查看它们的定义。您可能不会修改指向的字符(字符串是引用计数的,如果有其他所有者并且您修改了字符串,那么其他所有者会非常惊讶地发现他们的字符串已更改)。我会看看我能做些什么来修复文档。感谢您的提醒。
  • 这没有回答问题。他询问如何从 Platform::String 转换为 char* 并且有办法做到这一点。 WideCharToMultiByte 有效,但该函数的新手不知道如何使用它。
【解决方案3】:

您不应该将宽字符转换为 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();

【讨论】:

  • 或者一个不使用stdext的线性char* raw = std::wstring_convert&lt;std::codecvt_utf8&lt;wchar_t&gt;&gt;().to_bytes(fooRT-&gt;Data()).c_str();
  • 但是使用@Quest 的方法,raw 变量将指向释放的内存(在计算表达式后临时对象消失),如果按字面意思使用的话。除非您确定自己在做什么,否则最好使用std::string utf8 = std::wstring_convert&lt;std::codecvt_utf8&lt;wchar_t&gt;&gt;().to_bytes(fooRT-&gt;Data())
【解决方案4】:

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

从 unicode 转换为 ascii 或其他,即 char16*char*,是另一回事。您可能不需要它,因为如今大多数方法都有其 wchar 版本。

【讨论】:

  • 唉,因为我并不生活在 wchar 世界中。我正在使用的大部分代码都是需要 8 位字符字符串的遗留代码。 :)
【解决方案5】:

使用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);

【讨论】:

    猜你喜欢
    • 2016-02-14
    • 1970-01-01
    • 2011-01-26
    • 2015-12-23
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 2011-08-13
    相关资源
    最近更新 更多