如何轉換Platform :: String的內容以供需要基於char *的字符串的函數使用?我假設WinRT爲此提供了輔助函數,但我無法找到它們。如何將Platform :: String轉換爲char *?
謝謝!
如何轉換Platform :: String的內容以供需要基於char *的字符串的函數使用?我假設WinRT爲此提供了輔助函數,但我無法找到它們。如何將Platform :: String轉換爲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
轉換爲多字節。
是否有任何城市特定的「間接」方法轉換爲char *? – djcouchycouch 2012-07-31 18:20:45
'WideCharToMultiByte'可從Metro風格的應用程序中調用。 – 2012-07-31 18:21:14
我明白了。好,謝謝! – djcouchycouch 2012-07-31 18:27:03
有String::Data
方法返回const char16*
,這是原始的unicode字符串。
從unicode到ascii或其他任何內容(即char16*
到char*
)的轉換是另一回事。您可能不需要它,因爲現在大多數方法都有wchar
版本。
唉,因爲我不生活在一個wchar世界。我正在使用的大部分代碼都是需要8位字符串的遺留代碼。 :) – djcouchycouch 2012-07-31 18:16:16
這是一個非常簡單的方法來做到這一點代碼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*
是在棧上,一旦它離開範圍
對於每一個問題,都有一個解決方案,簡單,優雅。錯了。像這個。根據執行中的線程當前狀態,任何超出ASCII字符範圍的字符將被屠殺爲隨機表示。 **不要使用這個解決方案**(這很容易,因爲它甚至沒有編譯。) – IInspectable 2016-10-24 01:56:29
修復了編譯器錯誤。 PS:如果100%確定只需要處理ASCII字符 – bas 2016-11-05 21:16:23
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);
你不應該投寬字符的字符,你會裂傷每個字符使用多個字節,如語言中文。這是正確的方法。
#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
但是使用@Quest的方法,如果使用字面意思,'raw'變量將指向釋放內存(臨時對象在評估表達式後消失)。除非你確定你在做什麼,否則更好地使用'std :: string utf8 = std :: wstring_convert
除非指定目標字符編碼,否則不能要求從UTF-16LE進行轉換。它是什麼? – IInspectable 2016-10-24 02:02:05