1.字符编码
Unicode - 一项标准;
在windows-vista中,每个unicode字符都使用UTF-16编码;
各种用于表示字符的UTF标准:
1. UTF-8: 有的字符编码为1个字节,有的两个字节,有的3个,有的4个字节;
2. UTF-16: 将每个字符都编码为 2个字节;
3. UTF-32: 将每个字符都编码为 4个字节;
2. ANSI字符和Unicode字符与字符串数据类型
C语言用 char数据类型 来表示 一个8位的 ANSI字符;
Microsof c/c++编译器定义的 内建数据类型 wchar_t : 表示一个16位 的Unicode字符;
windows中在WinNT.h中定义的兼容 ANSI和 Unicode字符的 类型和宏:
typedef WCHAR / CHAR TCHAR, *PTCHAR, PTSTR;
typedef CONST WCHAR / CHAR * PCTSTR;
_T() ; TEXT();
3.Windows中的Unicode和ANSI函数
从windows NT起,windows所有版本都使用Unicode来构建,所有核心函数都需要Unicode字符串;
调用windows函数时,如果传入ANSI字符,函数会先转成Unicode字符,再把结果传送给操作系统;所以,如果使用ANSI字符,会有额外开销;
windows函数通常有两个版本- 后缀+W表示Unicode版本,+A表示ANSI版本;
4. C运行库中的Unicode函数和ANSI函数
C运行库 有一系列函数来处理Unicode字符和ANSI字符,且不会在内部相互调用,即 ANSI版函数不会在内部将字符转成Unicode字符再调用Unicode版函数, 都是“自力更生”;
C运行库中,返回ANSI字符长度的函数: strlen; 返回Unicode字符长度的函数: wcslen;
再TChar.h中,兼容 ANSI和Unicode字符的版本:_tcslen;
#ifdef _UNICODE
#define _tcslen wcslen
#else
#define _tcslen strlen
#endif
针对不属于C++标准一部分的标识符,C运行库始终为其附加下划线 前缀;
5.C运行库中的安全字符串函数
包含头文件StrSafe.h, 现有的每一个函数,都有一个对应的新版本的函数,前面名称相同,在最后添加一个 _s(代表secure)后缀;如:_tcscpy 对应的新函数: _tcscpy_s;
计算字符数: 使用_countof宏;
6.推荐的字符和字符串处理方式
使用TCHAR/PTSTR, BYTE/PBYTE, TEXT或_T宏, 执行全局替换,如PTSTR替换PSTR;
7.ANSI和Unicode字符转换
MultiByteToWideChar函数 将 多字节字符转换为宽字符串;
WideCharToMultiByte函数则 将宽字符串转换为 多字节字符串;
8.导出ANSI和Unicode DLL函数
动态链接库中,对于一个功能的函数,如实现字符串反转 ,有ANSI和Unicode两个版本, 可以先实现 Unicode版本的字符串反转函数的工资,对于ANSI版本的函数, 只需先将其字符串转换为 Unicode字符,然后调用Unicode版的字符串反转函数, 再将结果字符串转换回 ANSI字符串;
9.判断文本是ANSI还是Unicode
由AdvApi32.dll导出,在winbase.h中声明的IsTextUnicode函数 实现分辨 字符类型是ANSI还是Unicode, 但是结果不是百分百准确;