1.宽窄字节的区别和重要性
char* char 都是窄字节,适配英文字母,随着国际化,,窄字节无法表示,所以引入宽字节,即unicode(规定任意字符占两个字节) wchar-t 其原型是unsigned short
2.操作系统和编译器对宽窄的支持
api:MessageboxA 窄字节 MessageboxW 宽字节 编译器根据当前配置的编码环境定义对应的宏_UNICODE,没有定义就是窄字节,定义了则是Unicode编码 宽字节,api会自动解析对应的函数
界面开发 为了效率最好用unicode编码省去了系统转换 VS字符集配置 多字节是窄字节 Unicode是宽字节
优缺点:
unicode网络传输影响速度
宽窄字节的数据类型
窄字节 char char*(PCHAR PSTR LPSTR)LPCSTR
宽字节 wchar-t wchar-t *(PWCHAR PWSTR LPWSTR)LPCWSTR
T通用类型 TCHAR(TCHAR* PTCHAR PTSTR LPTSTR)LPCTSTR
P代表指针 str字符串 L代表长指针 C标识常量 W标识宽字节 T标识通用类型
int MessageBox(
[in, optional] HWND hWnd,
[in, optional] LPCTSTR lpText,
[in, optional] LPCTSTR lpCaption,
[in] UINT uType
);
_T和_L的区别在于,_L不管你是以什么方式编译,一律以UNICODE方式保存。 #ifdef _UNICODE的时候
_T就是L
没有#ifdef _UNICODE的时候
_T就是ANSI的。
LPTSTR lpStr = new TCHAR[32];
TCHAR* szBuf = _T("Hello");
以上两句使得无论是在UNICODE编译条件下都是正确编译的。
2.宽窄字符的使用
字符串长度:
● Ansi:strlen(char *str);
● Unicode:wcslen(wchar_t *str);
● 通用函数:_tcslen(TCHAR *str);
● Ansi:int atoi(const char *str);
● Unicode:int _wtoi(const wchar_t *str);
● 通用函数:_tstoi(const TCHAR *str);
字符串拷贝:
● Ansi:strcpy(char *strDestination, const char *strSource);
● Unicode:wcscpy(wchar_t *strDestination, const wchar_t *strSource);
● 通用函数:_tcscpy(TCHAR *strDestination, const TCHAR *strSource);
int main()
{
char* p = "123";
int len_p = strlen(p);
wchar* p1 = L“456”;
int len_P1 = wcslen(p1) ;
tchar * p2 = _T("");
int len_p2 = _tcslen(p2);
int size_p = (stren(p)+1*sizeof(char));
int size_p1 = (wcslen(p1)+1*sizeof(wchar_t));
int size_p2 = (_tcslen(p2)+1*sizeof(TCHAR));
}