《windows核心编程》第2章 UNICODE字符

一、基础内容

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

《windows核心编程》第2章 UNICODE字符_第1张图片

1.3 测试

1、没有定义UNICODE

《windows核心编程》第2章 UNICODE字符_第2张图片

《windows核心编程》第2章 UNICODE字符_第3张图片

2、定义了UNICODE

《windows核心编程》第2章 UNICODE字符_第4张图片

《windows核心编程》第2章 UNICODE字符_第5张图片

3、控制台打印宽字符会有错误

(1) Windows的控制台根据系统非UNICODE编码及位置的设置,控制台在输出中文时默认是GBK编码,控制台输出UTF8字符会变成乱码。采用宽字符输出,这样就避免了控制台字符集的问题

(2) 控制台宽字符显示有个必要的条件:控制台的字体应当支持宽字符。将控制台的代码页修改为
437(OEM-United States),默认的Lucida Console字体支持宽字符,使用_setmode来设置标准输出为_O_U16TEXT

《windows核心编程》第2章 UNICODE字符_第6张图片

二、使用安全字符串

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

《windows核心编程》第2章 UNICODE字符_第7张图片

三、补充函数

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内存块中

《windows核心编程》第2章 UNICODE字符_第8张图片

3.4 字符串比较函数

compareString()和compareStringOrdinal()

《windows核心编程》第2章 UNICODE字符_第9张图片

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

你可能感兴趣的:(windows)