wchar_t*(LPWSTR)与char*(LPSTR)相互转换
wchar_t 是 C 和 C++ 编程语言中的一种基本数据类型,用于存储宽字符。它是"wide character"的缩写,设计初衷是为了支持多语言环境,特别是那些使用Unicode或其它多字节字符集的语言,如中文、日文、韩文等。char占用一个字节,只能表示256个字符。而wchar_t占用两个字节,可以表示65536个字符。
·
wchar_t 介绍
- wchar_t 是 C 和 C++ 编程语言中的一种基本数据类型,用于存储宽字符。它是"wide character"的缩写,设计初衷是为了支持多语言环境,特别是那些使用Unicode或其它多字节字符集的语言,如中文、日文、韩文等。
- char占用一个字节,只能表示256个字符。而wchar_t占用两个字节,可以表示65536个字符。
wchar_t 赋值
- wchar_t 赋值时在字符前加上L前缀来指示这是一个宽字符或宽字符串
-
wchar_t wstr1 = L'A'; wchar_t *wstr2 = L"Hello World wstr2"; wchar_t wstr3[] = L"Hello World wstr3";
- 也可以通过TEXT宏来进行赋值,一般用在使用Unicode编码的工程中,根据是否定义了Unicode,TEXT会判断是否在字符串前加上L
-
wchar_t wstrt[] = TEXT("Hello World TEXT");
LPWSTR 与 LPSTR
- LPWSTR 是 wchar_t*, LPCWSTR 是const wchar_t*
- LPSTR 是 char*, LPCSTR 是const char*
- 官方定义如下
-
typedef wchar_t* LPWSTR; typedef const wchar_t* LPCWSTR; typedef char* LPSTR; typedef const char* LPCSTR;
LPWSTR(wchar_t*)与LPSTR(char*)互相转换
相关API
-
/* * @brief 将宽字节字符串转换为多字节字符串 * @param [IN] CodePage 要转换到的多字节字符集的代码页 * CP_ACP - ANSI编码 * CP_UTF8 - UTF-8编码 * @param [IN] dwFlags 控制转换行为的标志,一般设置为0 * @param [IN] lpWideCharStr 指向要转换的宽字节字符串的指针 * @param [IN] cchWideChar 要转换的宽字节字符串的大小 * @param [OUT] lpMultiByteStr 指向输出的多字节字符缓冲区的指针 * @param [IN] cbMultiByte 指定lpMultiByteStr缓冲区的大小 * @param [IN] lpDefaultChar 可设置为NULL * @param [OUT] lpUsedDefaultChar 可设置为NULL * @return 成功时返回转换后字符串的实际字节数,失败时返回0 */ int WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte,LPCSTR lpDefaultChar,LPBOOL lpUsedDefaultChar); /* * @brief 将多字节字符串转换为宽字节字符串 * @param [IN] CodePage 要转换到的多字节字符集的代码页 * CP_ACP - ANSI编码 * CP_UTF8 - UTF-8编码 * @param [IN] dwFlags 控制转换行为的标志,一般设置为0 * @param [IN] lpMultiByteStr 指向要转换的多字节字符串的指针 * @param [IN] cbMultiByte 要转换的多字节字符串的大小 * @param [OUT] lpWideCharStr 指向输出的宽字节字符缓冲区的指针 * @param [IN] cchWideChar 指定lpWideCharStr缓冲区的大小 * @return 成功时返回转换后字符串的实际字节数,失败时返回0 */ int MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar);
编程示例
-
#include <iostream> #include <windows.h> int Wchar2Char(wchar_t* wcharStr, char* charStr); int Char2Wchar(char* charStr, wchar_t* wcharStr); int main(){ // wchar_t* -> char* wchar_t* wcharStrA = L"Hello World A"; char charStrA[1024] = { 0 }; Wchar2Char(wcharStrA, charStrA); // char* -> wchar_t* wchar_t wcharStrB[1024] = L""; char charStrB[] = "Hello World B"; Char2Wchar(charStrB, wcharStrB); system("pause"); return 0; } int Wchar2Char(wchar_t* wcharStr, char* charStr){ int len = WideCharToMultiByte(CP_ACP, 0, wcharStr, wcslen(wcharStr), NULL, 0, NULL, NULL); WideCharToMultiByte(CP_ACP, 0, wcharStr, wcslen(wcharStr), charStr, len, NULL, NULL); charStr[len]= '\0'; return len; } int Char2Wchar(char* charStr, wchar_t* wcharStr){ int len = MultiByteToWideChar(CP_ACP, 0, charStr, strlen(charStr), NULL, 0); MultiByteToWideChar(CP_ACP, 0, charStr, strlen(charStr), wcharStr, len); wcharStr[len]= '\0' ; return len; }
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献30条内容
所有评论(0)