16

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

谢谢!

+0

除非指定目标字符编码,否则不能要求从UTF-16LE进行转换。它是什么? – IInspectable 2016-10-24 02:02:05

回答

13

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

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

+0

是否有任何城市特定的“间接”方法转换为char *? – djcouchycouch 2012-07-31 18:20:45

+0

'WideCharToMultiByte'可从Metro风格的应用程序中调用。 – 2012-07-31 18:21:14

+0

我明白了。好,谢谢! – djcouchycouch 2012-07-31 18:27:03

1

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

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

+2

唉,因为我不生活在一个wchar世界。我正在使用的大部分代码都是需要8位字符串的遗留代码。 :) – djcouchycouch 2012-07-31 18:16:16

13

这是一个非常简单的方法来做到这一点代码w/o不必担心缓冲区长度。

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

请记住,在这个例子中,char*是在栈上,一旦它离开范围

+2

对于每一个问题,都有一个解决方案,简单,优雅。错了。像这个。根据执行中的线程当前状态,任何超出ASCII字符范围的字符将被屠杀为随机表示。 **不要使用这个解决方案**(这很容易,因为它甚至没有编译。) – IInspectable 2016-10-24 01:56:29

+0

修复了编译器错误。 PS:如果100%确定只需要处理ASCII字符 – bas 2016-11-05 21:16:23

1

A将消失:只有当你确定你正在处理的ASCII使用此解决方案解决方案使用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); 
5

你不应该投宽字符的字符,你会裂伤每个字符使用多个字节,如语言中文。这是正确的方法。

#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(); 
+0

或者一个线性而不使用stdext,转换仍然是一个很好的方法。char * raw = std :: wstring_convert >()。to_bytes(fooRT - > Data())。c_str();' – Quest 2015-09-11 16:01:22

+2

但是使用@Quest的方法,如果使用字面意思,'raw'变量将指向释放内存(临时对象在评估表达式后消失)。除非你确定你在做什么,否则更好地使用'std :: string utf8 = std :: wstring_convert >()。to_bytes(fooRT-> Data())' – 2017-11-21 12:28:56

相关问题