詳解C/C++實現(xiàn)各種字符轉(zhuǎn)換方法合集
一、std::string 和 std::wstring 互轉(zhuǎn)
1、直接聲明std::wstring
std::wstring uriImage{L"D:\\Project\\screen.jpg"};
Uri uri{ uriImage };
2、wstring_convert
由于C++17之后取消std::codecvt_utf8的支持,所以這個方法不是最好的??梢钥紤]使用WideCharToMultiByte和MultiByteToWideChar替代。
std::wstring wideString = std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes(stringToConvert);
3、WideCharToMultiByte和MultiByteToWideChar
std::string MyTools::ConvertWideToANSI(const std::wstring& wstr)
{
int count = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.length(), NULL, 0, NULL, NULL);
std::string str(count, 0);
WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, &str[0], count, NULL, NULL);
return str;
}
std::wstring MyTools::ConvertAnsiToWide(const std::string& str)
{
int count = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), NULL, 0);
std::wstring wstr(count, 0);
MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), &wstr[0], count);
return wstr;
}
std::string MyTools::ConvertWideToUtf8(const std::wstring& wstr)
{
int count = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), wstr.length(), NULL, 0, NULL, NULL);
std::string str(count, 0);
WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, &str[0], count, NULL, NULL);
return str;
}
std::wstring MyTools::ConvertUtf8ToWide(const std::string& str)
{
int count = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), NULL, 0);
std::wstring wstr(count, 0);
MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), &wstr[0], count);
return wstr;
}二、winrt::hstring 和 std::string 互轉(zhuǎn)
winrt::hstring是C++/WinRT 的自定義字符串類型(在 C++/WinRT 基礎(chǔ)庫中定義,即%WindowsSdkDir%Include\<WindowsTargetPlatformVersion>\cppwinrt\winrt\base.h)。
// 直接聲明一個winrt::hstring
winrt::hstring w{L"zh-CN"};
// 調(diào)用winrt::to_hstring方法直接把std::string轉(zhuǎn)為winrt::hstring
winrt::hstring htr = winrt::to_hstring("this is a std string");
// 調(diào)用winrt::to_string轉(zhuǎn)為std::string
winrt::hstring w{L"zh-CN1111測試"};
std::string temp = winrt::to_string(w);
三、const char* 和 char* 互轉(zhuǎn)
1、const char*轉(zhuǎn)char*
const char *filePath= "abc"; char *newPath = const_cast<char *>(filePath);
2、 char*轉(zhuǎn)const char*
直接賦值即可
const char* cpc; char* pc = "abcde"; cpc = pc;
四、QString 和 std::string 互轉(zhuǎn)
std::string a = "asdfg";
QString path = QString::fromStdString("asdfg");
std::string d = path.toStdString();補充
CString 和 *char 的轉(zhuǎn)換
1:CString -> *char
1)CString轉(zhuǎn)化為*char可以使用CString中的GetBuffer()函數(shù),具體如下:
CString string1 = _T("string");
char *str = string1.GetBuffer();注意的是,在GetBuffer后要使用ReleaseBuffer以更新對象內(nèi)部數(shù)據(jù),否則會發(fā)生不可意料的意外。
2)可以使用強制轉(zhuǎn)換。
CString string1 = _T(“string”); char *str = (LPTSTR)(LPCTSTR)string1;
3)也可使用函數(shù)strcpy實現(xiàn)轉(zhuǎn)換。
4)使用CString的GetAt()函數(shù):
CString string1 = _T("string");
char *str = string1.GetAt(0);即獲取下標(biāo)為0的字符。
2:*char -> CString
1)使用format函數(shù):
char *str = "string";
CString string1;
string1.format("%s",str);2)同樣也可以強制轉(zhuǎn)換:
char *str = "string"; CString string1(str);
*char 與 int 的轉(zhuǎn)換
1:*char -> int
1)使用atoi()函數(shù):
char *val = "12345"; int num = atoi(val);
2:int -> *char
1)使用itoa()函數(shù):
int num = 12345; char buf[5]; itoa(buf, num, 10);
itoa()函數(shù)中后面10代表十進制。
2)使用sprintf()函數(shù):
int num = 12345; char buf[6]; sprintf(buf, "%d", num);
到此這篇關(guān)于詳解C/C++實現(xiàn)各種字符轉(zhuǎn)換方法合集的文章就介紹到這了,更多相關(guān)C++字符轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
fatal error LNK1104: 無法打開文件“l(fā)ibc.lib”的解決方法
本篇文章是對fatal error LNK1104: 無法打開文件“l(fā)ibc.lib”的解決方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05
Visual Studio 2019 如何新建 Win32項目的方法步驟
這篇文章主要介紹了Visual Studio 2019 如何新建 Win32項目的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
C++用兩個棧實現(xiàn)一個隊列(面試官的小結(jié))
這篇文章主要給大家介紹了關(guān)于C++用兩個棧實現(xiàn)一個隊列的相關(guān)資料,這是來自一名面試官的小結(jié),文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05

