• 《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

    1.3 测试

    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函数

    三、补充函数

    3.1 wcslen()

    求宽字符串长度的函数 wcslen(TEXT("str.."));

    3.2 stringCchCat()

    将一个字符串连接到另一个字符串

    1. HRESULT stringCchCat(
    2.         __inout LPTSTR pszDest,
    3.         __in size_t cchDest,
    4.         __in LPCTSTR pszSrc
    5. );

    pszDest:目标字符串 

    cchDest:目标字符串内存大小

    pszSrc:源字符串

    3.3 StringCchPrintf()

    这是一个字符串拷贝函数,在strsafe.h中

    1. HRESULT stringcchprintf(
    2.         __out LPTSTR pszDest,
    3.         __in size_t cchDest,        // 目标内存大小.
    4.         __in LPCTSTR pszFormat,
    5.         __in ...
    6. );

    这个函数和printft函数用法类似,只是将字符写入了psDest内存块中

    3.4 字符串比较函数

    compareString()和compareStringOrdinal()

    3.5 宽字符与多字符之间的转换

    1. int Multi ByteTowideChar(
    2. __in UINT CodePage,
    3. __in DWORD dwFlags, 
    4. __in LPCSTR lpMultiByteStr,
    5. __in int cbMultiByte,
    6. __out LPWSTR lpwideCharstr,
    7. __in int cchwideChar
    8. );
    9. int wideCharToMultiByte(
    10. __in UINT CodePage,
    11. __in DWORD dwFlags, 
    12. __in LPCWSTR lpWideCharstr,
    13. __in int cchwideChar,
    14. __out LPSTR lpMu1tiBytestr,
    15. __in int cbMultiByte, 
    16. __in LPCCH lpDefaultChar,
    17. __out LPBOOL lpUsedDefaultChar

  • 相关阅读:
    数学建模笔记
    怎么从零开始搭建配置Windows云服务器的新手入门教程
    ansible安装wordpress
    Spring框架—POJO对象模型
    一种简单通用的获取函数栈空间大小的方法
    基于BP神经网络和ORL库的人脸识别matlab仿真
    第4章 操作BLOB类型字段 & 第5章 批量插入
    网络安全架构:安全架构公理
    eNSP笔记②
    行业分析| 智慧消防对讲
  • 原文地址:https://blog.csdn.net/HuanBianCheng27/article/details/133961519