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

相關問題