目录 一、std::string 和 std::wstring 互转 1、直接声明std::wstring 2、wstring_convert 3、WideCharToMultiByte和MultiByteToWideChar 二、winrt::hstring 和 std::string 互转 三、const char* 和 char* 互转 1、const char*转
目录
- 一、std::string 和 std::wstring 互转
- 1、直接声明std::wstring
- 2、wstring_convert
- 3、WideCharToMultiByte和MultiByteToWideChar
- 二、winrt::hstring 和 std::string 互转
- 三、const char* 和 char* 互转
- 1、const char*转char*
- 2、 char*转const char*
- 四、QString 和 std::string 互转
- 补充
- CString 和 *char 的转换
- *char 与 int 的转换
一、std::string 和 std::wstring 互转
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 互转
winrt::hstring是C++/WinRT 的自定义字符串类型(在 C++/WinRT 基础库中定义,即%WindowsSdkDir%Include\<WindowsTargetPlatformVersion>\cppwinrt\winrt\base.h)。
// 直接声明一个winrt::hstring winrt::hstring w{L"zh-CN"}; // 调用winrt::to_hstring方法直接把std::string转为winrt::hstring winrt::hstring htr = winrt::to_hstring("this is a std string"); // 调用winrt::to_string转为std::string winrt::hstring w{L"zh-CN1111测试"}; std::string temp = winrt::to_string(w);
三、const char* 和 char* 互转
1、const char*转char*
const char *filePath= "abc"; char *newPath = const_cast<char *>(filePath);
2、 char*转const char*
直接赋值即可
const char* cpc; char* pc = "abcde"; cpc = pc;
四、QString 和 std::string 互转
std::string a = "asdfg"; QString path = QString::fromStdString("asdfg"); std::string d = path.toStdString();
补充
CString 和 *char 的转换
1:CString -> *char
1)CString转化为*char可以使用CString中的GetBuffer()函数,具体如下:
CString string1 = _T("string"); char *str = string1.GetBuffer();
注意的是,在GetBuffer后要使用ReleaseBuffer以更新对象内部数据,否则会发生不可意料的意外。
2)可以使用强制转换。
CString string1 = _T(“string”); char *str = (LPTSTR)(LPCTSTR)string1;
3)也可使用函数strcpy实现转换。
4)使用CString的GetAt()函数:
CString string1 = _T("string"); char *str = string1.GetAt(0);
即获取下标为0的字符。
2:*char -> CString
1)使用format函数:
char *str = "string"; CString string1; string1.format("%s",str);
2)同样也可以强制转换:
char *str = "string"; CString string1(str);
*char 与 int 的转换
1:*char -> int
1)使用atoi()函数:
char *val = "12345"; int num = atoi(val);
2:int -> *char
1)使用itoa()函数:
int num = 12345; char buf[5]; itoa(buf, num, 10);
itoa()函数中后面10代表十进制。
2)使用sprintf()函数:
int num = 12345; char buf[6]; sprintf(buf, "%d", num);
到此这篇关于详解C/C++实现各种字符转换方法合集的文章就介绍到这了,更多相关C++字符转换内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!