一、基础内容
1.1 UNICODE和UTF-8
下面是我个人的理解
UNICODE用2个字节来代表一个字符
UTF-8用1-4个字节来表示一个字符。可变长度的实现原理是ASCII字符只有7位,首位如果是1表示不是ASCII,说明这个字符和后面的字符联合起来形成新字符。
1.2 字符的数据类型
UNICODE类型的字符都是宽字符,在C语言中的数据类型是:wchar_t,这是一个基本数据类型
用宏TEXT()可以兼容宽字符和char字符。如果在程序中定义了UNICODE,那么会把TEXT()中的字符认为是wchar_t*;如果没定义,则把TEXT()中的字符认为是char*
同样的,根据是否定义UNICODE,接收用TCHAR
1.3 测试
1、没有定义UNICODE
2、定义了UNICODE
3、控制台打印宽字符会有错误
(1) Windows的控制台根据系统非UNICODE编码及位置的设置,控制台在输出中文时默认是GBK编码,控制台输出UTF8字符会变成乱码。采用宽字符输出,这样就避免了控制台字符集的问题
(2) 控制台宽字符显示有个必要的条件:控制台的字体应当支持宽字符。将控制台的代码页修改为
437(OEM-United States),默认的Lucida Console字体支持宽字符,使用_setmode来设置标准输出为_O_U16TEXT
二、使用安全字符串
我们编程的时候,尽量使用安全字符串,例如strcpy就是一个非安全函数,当你在程序中使用这个函数的时候,你就会发现,编译器会出现警告,同时会提示我们使用strcpy_s函数
三、补充函数
3.1 wcslen()
求宽字符串长度的函数 wcslen(TEXT("str.."));
3.2 stringCchCat()
将一个字符串连接到另一个字符串
HRESULT stringCchCat(
__inout LPTSTR pszDest,
__in size_t cchDest,
__in LPCTSTR pszSrc
);
pszDest:目标字符串
cchDest:目标字符串内存大小
pszSrc:源字符串
3.3 StringCchPrintf()
这是一个字符串拷贝函数,在strsafe.h中
HRESULT stringcchprintf(
__out LPTSTR pszDest,
__in size_t cchDest, // 目标内存大小.
__in LPCTSTR pszFormat,
__in ...
);
这个函数和printft函数用法类似,只是将字符写入了psDest内存块中
3.4 字符串比较函数
compareString()和compareStringOrdinal()
3.5 宽字符与多字符之间的转换
int Multi ByteTowideChar(
__in UINT CodePage,
__in DWORD dwFlags,
__in LPCSTR lpMultiByteStr,
__in int cbMultiByte,
__out LPWSTR lpwideCharstr,
__in int cchwideChar
);
int wideCharToMultiByte(
__in UINT CodePage,
__in DWORD dwFlags,
__in LPCWSTR lpWideCharstr,
__in int cchwideChar,
__out LPSTR lpMu1tiBytestr,
__in int cbMultiByte,
__in LPCCH lpDefaultChar,
__out LPBOOL lpUsedDefaultChar