下面是我个人的理解
UNICODE用2个字节来代表一个字符
UTF-8用1-4个字节来表示一个字符。可变长度的实现原理是ASCII字符只有7位,首位如果是1表示不是ASCII,说明这个字符和后面的字符联合起来形成新字符。
UNICODE类型的字符都是宽字符,在C语言中的数据类型是:wchar_t,这是一个基本数据类型
用宏TEXT()可以兼容宽字符和char字符。如果在程序中定义了UNICODE,那么会把TEXT()中的字符认为是wchar_t*;如果没定义,则把TEXT()中的字符认为是char*
同样的,根据是否定义UNICODE,接收用TCHAR

1、没有定义UNICODE


2、定义了UNICODE


3、控制台打印宽字符会有错误
(1) Windows的控制台根据系统非UNICODE编码及位置的设置,控制台在输出中文时默认是GBK编码,控制台输出UTF8字符会变成乱码。采用宽字符输出,这样就避免了控制台字符集的问题
(2) 控制台宽字符显示有个必要的条件:控制台的字体应当支持宽字符。将控制台的代码页修改为
437(OEM-United States),默认的Lucida Console字体支持宽字符,使用_setmode来设置标准输出为_O_U16TEXT

_setmode(_fileno(stdout), _O_U16TEXT);
我们编程的时候,尽量使用安全字符串,例如strcpy就是一个非安全函数,当你在程序中使用这个函数的时候,你就会发现,编译器会出现警告,同时会提示我们使用strcpy_s函数

求宽字符串长度的函数 wcslen(TEXT("str.."));
将一个字符串连接到另一个字符串
- HRESULT stringCchCat(
- __inout LPTSTR pszDest,
- __in size_t cchDest,
- __in LPCTSTR pszSrc
- );
pszDest:目标字符串
cchDest:目标字符串内存大小
pszSrc:源字符串
这是一个字符串拷贝函数,在strsafe.h中
- HRESULT stringcchprintf(
- __out LPTSTR pszDest,
- __in size_t cchDest, // 目标内存大小.
- __in LPCTSTR pszFormat,
- __in ...
- );
这个函数和printft函数用法类似,只是将字符写入了psDest内存块中

compareString()和compareStringOrdinal()

- 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