使用Unicode的优势:

  • 便于在不同语言之间进行数据交换。
  • 让你的exe或者dll文件支持所有的语言。
  • 提高应用程序的执行效率

  Windows2000是使用Unicode重新开发的,核心部分都需要Unicode字符串。所以:

  • 当参数中传入一个ANSI字符串,那么系统就要先把这个ANSI字符串转换成Unicode,然后将Unicode字符串传给系统;
  • 当返回值是一个ANSI字符串,那么系统首先要把Unicode转成ANSI,才能返回给应用程序。

  这些操作必须要分配内存,调用函数,都是在你看不到的情况下发生的。因此直接使用Unicode,可以让你的应用程序更加高效率地运行。

  C语言对Unicode的支持是wchar_t。在VS中则是定义UINICODE和_UNICODE。

  ANSI改成Unicode字符串有三种方式,字符串前加一个L、使用TEXT宏和_T宏。

  如果是使用的DLL和调用它的EXE,分别使用Ansi版本和Unicode版本,只需要分配内存,然后转换就可以调用了。

  对于功能相同的两个函数,尽量使用Unicode的版本。

  ShlWApi.h头文件中,也提供了操作字符串的Ansi和Unicode版本。

  转换你的应用程序到Unicode版本的一些基本原则:

  • 将文本视为字符串,而不是char或者字节数组
  • 对于文本字符串和字符串,使用通用数据类型(TCHAR或者PTSTR)
  • 对于字节、字节指针和数据缓存,使用显式数据类型(BYTE,PBYTE)
  • 将TEXT宏用在字符和字符串上。
  • 执行全局性替换(例如使用PTSTR替换PSTR)
  • 字符串运算问题。使用Unicode版本字符串后,在分配内存的时候必须写sizeof(szBuffer)/sizeof(TCHAR)。这样的失误,编译器不会发出任何警告。

  Windows对字符串进行操作的函数:lstrcat、lstrcmp、lstrcmpi、lstrcpy、lstrlen。这些函数是作为宏实现的。真正比较两个Unicode字符串的函数是CompareString(LCID lcid, DWORD fdwStyle, PCWSTR pString1, int cch1, PCTSTR pString2, int cch2);

  • 第一个参数是函数GetThreadLocale()的返回值,它返回当前语言的设置;
  • 第二个参数用于标识一些标志,用于比较字符串时的方式。使用lstrcmplstrcmpi的话,默认值是不一样的。

  其他的C运行时函数为了支持Unicode的版本,例如CharLowerCharUpperCharLowerBuffCharUpperBuffIsCharAlphaisAlphaNumber

  最后一个是printf函数家族,有char版本的sprintfswprintf

  资源内的字符串们,会使用Unicode,不是也被系统内部转换。

  确定字符串是Ansi还是Unicode,可以使用函数IsTextUnicode区分,尽管它有可能返回不正确的结果

  在Unicode和Ansi之间转换字符串,使用两个函数MultiByteToWideCharWideCharToMultiByte

  

  

回炉重造之重读Windows核心编程-002-字符集的更多相关文章

  1. 回炉重造之重读Windows核心编程-003-内核对象

    内核对象是个比较难理解的概念,问题的根源就在于即使是<核心编程>书中也没有说清楚它的定义,只是不停地举例和描述它的性质,还有如何使用. 盲人摸象,难见全貌.只能尽可能列举它的性质,注意使用 ...

  2. 回炉重造之重读Windows核心编程-006-线程

    线程也是有两部分组成的: 线程的内核对象,操作系统用来管理线程和统计线程信息的地方. 线程堆栈,用于维护现场在执行代码的时候用到的所有函数参数和局部变量. 进程是线程的容器,如果进程中有一个以上的线程 ...

  3. 回炉重造之重读Windows核心编程-004-进程

    进程是一个正在运行的程序的实例,由内核对象和地址空间组成.进程是不活泼的,执行地址空间中代码的是在它的环境中运行线程.每个线程都需要自己的一组CPU寄存器和堆栈. 为了让所有线程都能运行,操作系统就要 ...

  4. 回炉重造之重读Windows核心编程-001-错误处理

    Windows处理错误靠的是API的返回值,类型不止一种种: VOID,函数不可能失败,Windows API的返回值很少是这个情况. BOOL,如果函数失败,则返回值是0,否则返回是非零值.不要测试 ...

  5. 《windows核心编程系列》二十一谈谈基址重定位和模块绑定

    每个DLL和可执行文件都有一个首选基地址.它表示该模块被映射到进程地址空间时最佳的内存地址.在构建可执行文件时,默认情况下链接器会将它的首选基地址设为0x400000.对于DLL来说,链接器会将它的首 ...

  6. Asp.Net SignalR 使用记录 技术回炉重造-总纲 动态类型dynamic转换为特定类型T的方案 通过对象方法获取委托_C#反射获取委托_ .net core入门-跨域访问配置

    Asp.Net SignalR 使用记录   工作上遇到一个推送消息的功能的实现.本着面向百度编程的思想.网上百度了一大堆.主要的实现方式是原生的WebSocket,和SignalR,再次写一个关于A ...

  7. windows核心编程 - 线程同步机制

    线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...

  8. windows核心编程---第二章 字符和字符串处理

        使用vc编程时项目-->属性-->常规栏下我们可以设置项目字符集合,它可以是ANSI(多字节)字符集,也可以是unicode字符集.一般情况下说Unicode都是指UTF-16.也 ...

  9. 《windows核心编程系列》二谈谈ANSI和Unicode字符集 .

    http://blog.csdn.net/ithzhang/article/details/7916732转载请注明出处!! 第二章:字符和字符串处理 使用vc编程时项目-->属性-->常 ...

随机推荐

  1. 矩阵matrix变换的用法(css3属性transform: matrix)

    参数 2D矩阵的表示 matrix(a,b,c,d,e,f),其中6个参数在矩阵的分布: -- -- | a c e | | b d f | | 0 0 1 | -- -- 在CSS3中矩阵的原始值是 ...

  2. CF990G

    题意 https://codeforces.com/contest/990/problem/G 思考 在200000以内,因数个数最多的数位166320,共有160个因数.可以知道,从一个节点向下走最 ...

  3. rabbitmq使用总结

    rabbitmq 架构图 RabbitMQ 中的 broker 是指什么?cluster 又是指什么 broker 是指一个或多个 erlang node 的逻辑分组,且 node 上运行着 Rabb ...

  4. C/C++画一个巨型五角星

    把朱老师拉着画了半天 利用正弦定理判断一个点是否是否在五角星内,相对于五角星中心的四个象限特判一下来修改角度,把角度都转化成最上面的角,就差不多了,没仔细调整五角星位置,很丑 当然其实也有更方便的方法 ...

  5. Shell之信号捕获

    前言 当我们在运行某一段代码的时候,希望有类似事物一样的操作,要么成功,要么失败:一般的shell脚本都是自上而下,从左之后运行,碰到异常信号就会出错,从而终止脚本的运行,这个时候脚本可能运行到某一处 ...

  6. Docker底层架构之网络实现

    前言 Docker 的网络实现其实就是利用了 Linux 上的网络命名空间和虚拟网络设备(特别是 vethpair). 基本原理 首先,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)来 ...

  7. Java 中的各种锁和 CAS + 面试题

    Java 中的各种锁和 CAS + 面试题 如果说快速理解多线程有什么捷径的话,那本文介绍的各种锁无疑是其中之一,它不但为我们开发多线程程序提供理论支持,还是面试中经常被问到的核心面试题之一.因此下面 ...

  8. React使用antd按需引入报错

    引言 按照antd官网配置按需引入,还是出现一系列的报错: 原因 在网上搜了一下,大部分说是react-scripts以及react-app-rewired版本不兼容的问题,我果断把下载低版本 npm ...

  9. IntelliJ IDEA的这个接口调试工具真是太好用了!

    你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...

  10. Struts(六)

    JSON(JavaScript Object Notation)    1.一种轻量级的数据交换格式    2.通常用于在客户端和服务器之间传递数据    3.jQuery的所有参数都是以JSON格式 ...