回炉重造之重读Windows核心编程-002-字符集
使用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()的返回值,它返回当前语言的设置;
- 第二个参数用于标识一些标志,用于比较字符串时的方式。使用lstrcmp和lstrcmpi的话,默认值是不一样的。
其他的C运行时函数为了支持Unicode的版本,例如CharLower、CharUpper、CharLowerBuff、CharUpperBuff、IsCharAlpha、isAlphaNumber。
最后一个是printf函数家族,有char版本的sprintf和swprintf。
资源内的字符串们,会使用Unicode,不是也被系统内部转换。
确定字符串是Ansi还是Unicode,可以使用函数IsTextUnicode区分,尽管它有可能返回不正确的结果。
在Unicode和Ansi之间转换字符串,使用两个函数MultiByteToWideChar和WideCharToMultiByte。
回炉重造之重读Windows核心编程-002-字符集的更多相关文章
- 回炉重造之重读Windows核心编程-003-内核对象
内核对象是个比较难理解的概念,问题的根源就在于即使是<核心编程>书中也没有说清楚它的定义,只是不停地举例和描述它的性质,还有如何使用. 盲人摸象,难见全貌.只能尽可能列举它的性质,注意使用 ...
- 回炉重造之重读Windows核心编程-006-线程
线程也是有两部分组成的: 线程的内核对象,操作系统用来管理线程和统计线程信息的地方. 线程堆栈,用于维护现场在执行代码的时候用到的所有函数参数和局部变量. 进程是线程的容器,如果进程中有一个以上的线程 ...
- 回炉重造之重读Windows核心编程-004-进程
进程是一个正在运行的程序的实例,由内核对象和地址空间组成.进程是不活泼的,执行地址空间中代码的是在它的环境中运行线程.每个线程都需要自己的一组CPU寄存器和堆栈. 为了让所有线程都能运行,操作系统就要 ...
- 回炉重造之重读Windows核心编程-001-错误处理
Windows处理错误靠的是API的返回值,类型不止一种种: VOID,函数不可能失败,Windows API的返回值很少是这个情况. BOOL,如果函数失败,则返回值是0,否则返回是非零值.不要测试 ...
- 《windows核心编程系列》二十一谈谈基址重定位和模块绑定
每个DLL和可执行文件都有一个首选基地址.它表示该模块被映射到进程地址空间时最佳的内存地址.在构建可执行文件时,默认情况下链接器会将它的首选基地址设为0x400000.对于DLL来说,链接器会将它的首 ...
- Asp.Net SignalR 使用记录 技术回炉重造-总纲 动态类型dynamic转换为特定类型T的方案 通过对象方法获取委托_C#反射获取委托_ .net core入门-跨域访问配置
Asp.Net SignalR 使用记录 工作上遇到一个推送消息的功能的实现.本着面向百度编程的思想.网上百度了一大堆.主要的实现方式是原生的WebSocket,和SignalR,再次写一个关于A ...
- windows核心编程 - 线程同步机制
线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...
- windows核心编程---第二章 字符和字符串处理
使用vc编程时项目-->属性-->常规栏下我们可以设置项目字符集合,它可以是ANSI(多字节)字符集,也可以是unicode字符集.一般情况下说Unicode都是指UTF-16.也 ...
- 《windows核心编程系列》二谈谈ANSI和Unicode字符集 .
http://blog.csdn.net/ithzhang/article/details/7916732转载请注明出处!! 第二章:字符和字符串处理 使用vc编程时项目-->属性-->常 ...
随机推荐
- NOI2019滚粗记
Day -15 期末考完了,爆炸爆炸,就连数学和物理都错了好多傻*错误QwQ 哎呀管他的,NOI我来了! 跑到广附集训来了23333 Day -14 -- -2 做题,听题,哇和一群队爷在一个教室,真 ...
- laravel脚手架搭建项目问题之生产环境element-ui组件字体图标显示错误问题
问题描述: 1.element-ui组件使用的是npm安装 2.npm scripe模式开发 3.使用git命令行工具开发 3.开发环境下图标正常显示 4.生产环境下图标显示不正常 分析原因: 图标文 ...
- LeetCode 11 水池蓄水问题
今天给大家分享的是一道LeetCode中等难度的题,难度不大,但是解法蛮有意思.我们一起来看题目: Link Container With Most Water Difficulty Medium 题 ...
- PTA 练习 7-24 喊山 (30 分)
7-24 喊山 (30 分) 喊山,是人双手围在嘴边成喇叭状,对着远方高山发出"喂-喂喂-喂喂喂--"的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的& ...
- Leetcode 题目整理-2 Reverse Integer && String to Integer
今天的两道题关于基本数据类型的探讨,估计也是要考虑各种情况,要细致学习 7. Reverse Integer Reverse digits of an integer. Example1: x = 1 ...
- Tiny Linux -- tce-load
Tiny Linux which has its own package manager called "tce-load". There's a list of packages ...
- 【译】Serilog 配置基础知识
Serilog 使用简单的C# API来配置日志记录.当外部配置需要时,可以使用Serilog.Settings.AppSettings包(.NET 框架)或Serilog.Settings.Conf ...
- 时序数据库 Apache-IoTDB 源码解析之前言(一)
IoTDB 是一款时序数据库,相关竞品有 Kairosdb,InfluxDB,TimescaleDB等,主要使用场景是在物联网相关行业,如:车联网.风力发电.地铁.飞机监控等等,具体应用案例及公司详情 ...
- 04讲基础篇:经常说的CPU上下文切换是什么意思(下)
具体分析 自愿上下文切换变多了,说明进程都在等待资源,有可能发生了 I/O 等其他问题: 非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢 CPU,说明 CPU 的确成了瓶颈: 中断次数 ...
- C语言宏的神奇写法:语句块作为参数,算半个函数式编程?
我想要写几个循环做测试代码,每次都写 `for(size_t i = 0; i < n; i++)` 很烦人,然后就灵机一动,能不能用宏实现,然后就写出了: #define repeat(n, ...