ascii又叫多字节编码,每个字符1字节;
unicode又叫宽字节编码,每个字符2字节,支持多种语言,是windows底层支持的语言,所以编程时使用unicode更高效。
ascii | unicode | |
---|---|---|
datatype | char | wchar_t |
CHAR | WCHAR | |
WinMain | WinMain | wWinMain |
string | printf | wprintf |
strcpy | wcscpy | |
api | MessageBoxA | MessageBoxW |
L
表示将字符或字符串转换成宽字符集编码。
注意,字符不等于字节。
T版函数
使用_T
表示根据当前工程属性的需要,也可以写成_TEXT
,它只是一个宏,在使用的时候,需要将要处理的字符串用括号()
括起来,但 L 在使用时则可以不用括号。 头文件为<tchar.h>
。
#ifdef UNICODE
typedef LPWSTR LPTSTR
#else
typedef LPSTR LPTSTR
#endif // !UNICODE
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif // !UNICODE
所以,windows编程中没有CreateWindowEx()这个函数。
字符串转换api
int
WINAPI
WideCharToMultiByte(
_In_ UINT CodePage,
_In_ DWORD dwFlags,
_In_NLS_string_(cchWideChar) LPCWCH lpWideCharStr,
_In_ int cchWideChar,
_Out_writes_bytes_to_opt_(cbMultiByte, return) LPSTR lpMultiByteStr,
_In_ int cbMultiByte,
_In_opt_ LPCCH lpDefaultChar,
_Out_opt_ LPBOOL lpUsedDefaultChar
);
int
WINAPI
MultiByteToWideChar(
_In_ UINT CodePage,
_In_ DWORD dwFlags,
_In_NLS_string_(cbMultiByte) LPCCH lpMultiByteStr,
_In_ int cbMultiByte,
_Out_writes_to_opt_(cchWideChar, return) LPWSTR lpWideCharStr,
_In_ int cchWideChar
);
为了方便使用,提供两个宏。
#include <stdio.h>
#include <windows.h>
#define WCHAR_TO_CHAR(lpWCHAR, lpCHAR) \
WideCharToMultiByte(CP_ACP, NULL, lpWCHAR, -1, lpCHAR, _countof(lpCHAR), NULL, FALSE)
#define CHAR_TO_WCHAR(lpCHAR, lpWCHAR) \
MultiByteToWideChar(CP_ACP, NULL, lpCHAR, -1,lpWCHAR, _countof(lpWCHAR))
int main()
{
WCHAR wbuf[20] = { 0 };
CHAR cbuf[20] = { 0 };
WCHAR_TO_CHAR(L"abc", cbuf);
printf("%s\n",cbuf);
CHAR_TO_WCHAR("def",wbuf);
printf("%ls\n",wbuf);
return 0;
}
注意,宽字符输出格式%ls
,否则只输出d。
字符数应该使用_countof()
。
还有一个有点作弊的方法,就是先用CStringA,然后CStringW = cStringA;
反过来一样用。很常用!!!!!!!!!!!!!
数字字符串转换
数字->字符:
sprintf_s(), swprintf_s(), _stprintf()
_itoa_s(), _itow_s(), _ito_t_s()
字符->数字:
sscanf_s(), swscanf_s(), _stcanf_s()
atoi(), wtoi(), _ttoi()
strtol()
,可选进制。printf("%d\n",strtol("64",NULL,16));
字符串处理函数
ascii | unicode | T | |
---|---|---|---|
获取长度 | strlen | wcsnlen | _tcslen |
拷贝 | strcpy_s | wcscpy_s | _tcscpy_s |
与数字转换 | sscanf_s | swscanf_s | _stscanf_s |
sprintf_s | swprintf_s | _stprintf_s |