前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++宽字节与多字节之间的转换

C++宽字节与多字节之间的转换

作者头像
用户7886150
修改2021-02-22 10:23:05
1.5K0
修改2021-02-22 10:23:05
举报
文章被收录于专栏:bit哲学院bit哲学院

参考链接: C++ wmemset()

1.使用WideCharToMultiByte和MultiByteToWideChar; 2.使用mbstowcs_s和wcstombs_s(vs中添加_s); 3.使用c++11提供的wstring_convert<std::codecvt_utf8<wchar_t>>转换变量 demo:程序如下 下载地址https://pan.baidu.com/s/1yBRYKuRBMLkeMO3v1LJZjg 提取码:oh3t 

#include “iostream” #include “string” #include “locale.h” #include  #include “windows.h” using namespace std; 

//string 与 wstring之间的转换 string ws2s(const wstring &ws) { //setlocale需要头文件#include “locale.h” string curLocale = setlocale(LC_ALL, NULL); setlocale(LC_ALL, “chs”); const wchar_t* _Source = ws.c_str(); size_t _Dsize = 2 * ws.size() + 1; char* _Dest = new char[_Dsize]; memset(_Dest, 0, _Dsize); //wcstombs(_Dest, _Source, _Dsize); 为避免error C4996警告 size_t len = 0; wcstombs_s(&len, _Dest, _Dsize, _Source, _TRUNCATE); string result = _Dest; delete[] _Dest; setlocale(LC_ALL, curLocale.c_str()); return result; } 

wstring s2ws(const string &s) { string curLocale = setlocale(LC_ALL, NULL); setlocale(LC_ALL, “chs”); const char* _Source = s.c_str(); size_t _Dsize = s.size() + 1; wchar_t* _Dest = new wchar_t[_Dsize]; wmemset(_Dest, 0, _Dsize); size_t len = 0; mbstowcs_s(&len, _Dest, _Dsize, _Source, _TRUNCATE); wstring result = _Dest; delete[] _Dest; setlocale(LC_ALL, curLocale.c_str()); return result; } 

//char* 与 wchar_t* 之间的转换 char* wctoc(const wchar_t* str) { if (str == NULL) { return NULL; } DWORD num = WideCharToMultiByte(CP_ACP,0,str,-1,NULL,0,NULL,NULL); char* pRes = new char[num]; WideCharToMultiByte(CP_ACP, 0, str, -1, pRes, num, NULL, NULL); return pRes; } 

wchar_t* ctowc(const char* str) { if (str == NULL) { return NULL; } DWORD num = MultiByteToWideChar(CP_ACP,0,str,-1,NULL,0); wchar_t* pRes = new wchar_t[num]; MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, pRes, num); return pRes; } 

int main() { //string wstring 间转换 string s = “12345”; wstring ws = s2ws(s); wchar_t buf[20] = { 0 }; ws.copy(buf, ws.size(), 0); wprintf(L"test s2ws:%ws\n", buf); 

wstring ws2 = L"12345";

string s2 = ws2s(ws2);

char buf2[20] = { 0 };

s2.copy(buf2, s2.size(), 0);

printf("test ws2s:%s\n", buf2);

//char* 与wchar_t* 之间转换

const wchar_t* ws3 = L"abcde";

const char* s3 = wctoc(ws3);

printf("test2 wctoc: %s\n", s3);

delete[] s3;

s3 = NULL;

const char* s4 = "abcde";

const wchar_t* ws4 = ctowc(s4);

wprintf(L"test2 ctowc:%ws", ws4);

delete[] ws4;

ws4 = NULL;

wstring ws5{ L"Hello world." };

string s5;

// 声明一个用于转换的变量cv。所有的转换都经过此变量。

//头文件#include <codecvt>

wstring_convert<std::codecvt_utf8<wchar_t>> cv; 

s5 = cv.to_bytes(ws5);// 宽字节转多字节

printf("test3 ws to s:%s\n", s5.c_str());

string s6("helloworld");

wstring ws6 = cv.from_bytes(s6);// 多字节转宽字节

wprintf(L"test4 s to ws:%ws\n", ws6.c_str());

return 0;

}

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档