Win32API UNICODE编码&宽字节

  • 计算机是由于是美国人发明的,所以字符集先以英文为主。上世纪三十年代,满足自己的编码方式:ASC编码方式,以7位(bit)代表一个字符,能表示的字符才128个。因为以前内存很贵。128个字符足够美国人用的了。
  • 计算机发展到欧洲,发现ASC是不够用的。就发展为ASCII
    • 欧洲有些国家是不用英文的:如西班牙等~~

      • 升级ASCII后,用8位内存来表示字符编码,有256个字符。如此前128个定下来永久不变,后面128个分配给欧洲其它语种。欧洲有十几个国家,发现还是不够用。美国人采取了一种折中办法:在不增加内存的情况下,采取(CodePage)“代码页”的机制来表示字符编码。用一个数字来表示一个语种:比如用936代码汉语,或是用437代码英语等。如果代码页是中文代码页,后128就是汉字。如果代码页437那么后128就是英文。
  • 记住ASCII的常用3个位置:
    • 1 小写a的ASCII编码:97 ##助记:(眼镜a),香港回归
    • 2 大写A的ASCII编码:65
    • 3 阿拉伯数字0的ASCII编码:48 ##助记:“盗圣,你的事发(48)了~~”&&香港回归,建国48年(97-49)
  • 又过了些年发展,计算机来到亚洲,(8bit) 256也是不够用的。
    • 就是说汉字,后128给我们是绝对不够用的。就发展成DBCS(单双字节混合编码6万多个字符),当前计算机的主流编码方式。
    • DBCS这种编码先天具有缺陷,先天“小儿麻痹”,一个处理不当会产生乱码。因为英文占一个字节,汉字占两个字节,这个规定就不是唯一的,容易出错。解析字符串的时候,要有两种标准来分析字符串,处理就会先天的慢一些。
    • 最后就出现了UNICODE编码方式:可以认为是DBCS上的一个补丁,UNICODE统一规范:所有字符全部2个字符编码,英文汉字全部一发切,能能按两个字节来编码。在英文高字节上补0.
  • UNICODE编码方式有个缺点:占用内存空间,有浪费的嫌疑,但以现在的硬件来看,已经不是问题了。但它并不是市场上主流的编码方式。
  • 字符集的应用
    • char 有占用1个字节,有占用两个字节 (DBCS编码)
    • 宽字节 wchar_t每个占用两个字节 (UNICODE编码)
      • wchar_t实际是unsigned short类型(占用2个字节)
      • 定义时需要增加“L”. 给编译器看,通知编译器按照双字节编译字符串。
      • 需要使用支持wchar_t类型的函数,来操作宽字节字符串。
        wchar_t* pwszText = L"Hello wchar";
        wprintf(L"%s \n",pwszText);​
      • 这里不能套用标准C中的char*的函数了,双字节的操作一定要采用双字节对应的函数来操作。
  • windows中的新类型: TCHAR
    #ifdef UNICODE
    typedef wchar_t ​

    • 注意定义宏的位置,#ifdef XXX 具有向上朔源的属性,如果代码中有多个ifdef XXX 就应该让它统一的找到定义,或者找不到定义,不能自相矛盾。
      示范代码 定义宏的位置(#define UNICODE)要在windows.h文件的前面定义,因为windows.h头文件包含有WINNT.H文件,WINNT.H里面有“#ifdef UNICODE”的判断检测。

      #define UNICODE
      #include "stdafx.h"
      #include "stdio.h"
      #include <tchar.h>
      #include <windows.h>

      void T_char()
      {
      TCHAR *pszText = _TEXT("Hello");
      #ifdef UNICODE
      wprintf(L"%s\n",pszText);
      #else
      printf("单:%s\n",pszText);
      #endif

      }

      int main()
      {
      T_char();
      return 0;
      }

  • 示例: UNICODE编码中wprintf函数的支持有限,不完善,需要更换
    // WinChar.cpp : Defines the entry point for the console application.
    //

    #define UNICODE
    #include "stdafx.h"
    #include "stdio.h"
    #include <tchar.h>
    #include <windows.h>

    void PrintUnicode()
    {
    for (WORD nHigh = 0; nHigh <256; nHigh++)
    {
    for (WORD nLow = 0; nLow<256; nLow++)
    {
    wchar_t wChar = nHigh * 256 +nLow;
    wprintf(L"%s",&wChar);
    }
    printf("\n");
    }
    }

    int main()
    {
    PrintUnicode();
    return 0;
    }

  • UNICODE打印输出要使用 WriteConsole这个API来实施。
    BOOL WriteConsole(
    ​IN HANDLE hConsoleOutput, //标准输出句柄
    ​IN CONST VOID *lpBuffer, //输出内容的Buffer缓冲
    ​IN DWORD nNumberOfCharsToWrite, //准备输出内容长度
    ​OUT LPDWORD lpNumberOfCharsWritten, //返回实际输出内容长度
    ​IN LPVOID lpReserved //备用
    ​ );

    • 只有三个特殊的指向设备的句柄:1 键盘 2 显示器 3 错误设备 (其它句柄均指向内存)
      HANDLE WINAPI GetStdHandle(
      _In_ DWORD nStdHandle //input,output, or error device
      );//返回值 获取相应的标准句柄

转载于:https://www.cnblogs.com/bing-z/p/6855791.html

Win32API UNICODE编码宽字节相关推荐

  1. java emoji转unicode编码_4字节emoji表情对应的Unicode编码获取和编码转换

    GitHub Flavored Markdown 今天研究了一天Markdown移动端和pc端统一实现方式,由于以前有搞过移动端富文本编辑器,搞Markdown简单多了: 其中GFM的表情语法不错,比 ...

  2. Unicode编码问题,编程方面的技巧集合

    一.匹配Unicode字符的正则表达式 原文:http://blog.sunmast.com/Sunmast/archive/2004/07/30/799.aspx 这里是几个主要非英文语系字符范围( ...

  3. 用vc++如何得到汉字的Unicode编码?

    UNICODE环境设置 在安装Visual Studio时,在选择VC++时需要加入unicode选项,保证相关的库文件可以拷贝到system32下. UNICODE编译设置: C/C++, Prep ...

  4. winCE下Unicode编码

    Unicode :宽字节字符集 1. 如何取得一个既包含单字节字符又包含双字节字符的字符串的字符个数? 可以调用Microsoft Visual C++的运行期库包含函数_mbslen来操作多字节(既 ...

  5. 字节码:ASCII编码:单字节编码,ANSI编码:多字节编码,UNICODE编码:宽字节编码

    字符字节与编码 字符是人们常用的一些记号,比如"1", "汉", "お","℃"等等,包括各种语系的语言和一些符号都可以 ...

  6. Unicode编码与C语言宽字符

    文章目录 1.ASCII.ANSI.Unicode都是什么? 2.为什么需要宽字符? 3.C语言如何处理宽字符? 4.Windows中的字符串函数 1.ASCII.ANSI.Unicode都是什么? ...

  7. C语言小算法:ACSII码(多字节)和Unicode(宽字节)互转

    C语言小算法:ACSII码(多字节)和Unicode(宽字节)互转 代码: #include <Windows.h> #include <stdio.h> #include & ...

  8. Unicode编码 ASCII码 utf-8编码 中英文字符所占字节

    ASCII码 英文字符(字符和符号)占一个字节,中文字符(汉字和符号)占两个字节 utf-8编码 英文字符(字符和符号)占一个字节,中文字符(汉字和符号)占三个字节 Unicode编码 英文字符(字符 ...

  9. 4字节emoji表情对应的Unicode编码获取和编码转换

    GitHub Flavored Markdown 今天研究了一天Markdown移动端和pc端统一实现方式,由于以前有搞过移动端富文本编辑器,搞Markdown简单多了: 其中GFM的表情语法不错,比 ...

最新文章

  1. 图的度 知识图谱的一度关系 几度关系
  2. 几种经典的网络服务器架构模型的分析与比较
  3. 用户体验五要素_Kwai竞品分析-用户体验五要素
  4. Apache Accumulo 1.9.3 发布,高性能 K/V 存储方案
  5. spring学习笔记04-IOC常用注解(一)
  6. 文件路径:/和\的区别
  7. 实用教程!使用YOLOv3训练自己数据的目标检测
  8. 深入了解Java的SPI机制
  9. 网络子系统在链路层的收发过程剖析(一)【转】
  10. 图像增强之直方图均衡化
  11. 一款万能库存管理软件
  12. pdf文件如何转换成dwg文件
  13. Unity自定义创建脚本模板菜单
  14. 小程序各领域的代表出来溜大街了
  15. PPM-Pyramid pooling module
  16. microLite_timer,简洁、小巧精干的软件定时器
  17. 深度操作系统deepin 20.9 正式发布!
  18. getElementsByTagName的用法
  19. php同时抢购 代码,PHP秒杀抢购问答题解决方案
  20. 在线客服系统如何应对移动化市场需求

热门文章

  1. Pycharm安装与设置
  2. Android系统学习(一)------编译系统Android7.0
  3. 计算机毕业设计JAVA高校体育场馆预约管理系统设计与实现mybatis+源码+调试部署+系统+数据库+lw
  4. WEB实现Excel下载的一种方式--JAVA EXCEL
  5. html中怎么写虚线框的宽高,html如何设置虚线边框
  6. MonoRail学习-入门实例篇
  7. 网络攻防环境的搭建--MacOs配置Vmnet1及Vmnet8
  8. 整理18、19、20年关于《人工智能》的标准和评估规范
  9. maven的创建与配置和加载依赖
  10. mtk8788 pwm频率及背光亮度调节