windows核心编程-2-字符和字符串处理

1.字符编码

Unicode - 一项标准;

在windows-vista中,每个unicode字符都使用UTF-16编码;

各种用于表示字符的UTF标准:

     1. UTF-8:  有的字符编码为1个字节,有的两个字节,有的3个,有的4个字节;

      2. UTF-16: 将每个字符都编码为 2个字节;

     3. UTF-32: 将每个字符都编码为  4个字节;

 

2. ANSI字符和Unicode字符与字符串数据类型

  C语言用 char数据类型 来表示 一个8位的 ANSI字符;

  Microsof c/c++编译器定义的 内建数据类型  wchar_t : 表示一个16位 的Unicode字符;

 windows中在WinNT.h中定义的兼容 ANSI和 Unicode字符的 类型和宏:

typedef  WCHAR / CHAR     TCHAR, *PTCHAR, PTSTR;

typedef CONST WCHAR / CHAR  * PCTSTR;

_T() ; TEXT();

3.Windows中的Unicode和ANSI函数

 从windows NT起,windows所有版本都使用Unicode来构建,所有核心函数都需要Unicode字符串;

调用windows函数时,如果传入ANSI字符,函数会先转成Unicode字符,再把结果传送给操作系统;所以,如果使用ANSI字符,会有额外开销;

windows函数通常有两个版本- 后缀+W表示Unicode版本,+A表示ANSI版本;

 

4. C运行库中的Unicode函数和ANSI函数

C运行库 有一系列函数来处理Unicode字符和ANSI字符,且不会在内部相互调用,即 ANSI版函数不会在内部将字符转成Unicode字符再调用Unicode版函数, 都是“自力更生”;

C运行库中,返回ANSI字符长度的函数: strlen;  返回Unicode字符长度的函数: wcslen;

再TChar.h中,兼容 ANSI和Unicode字符的版本:_tcslen;

#ifdef _UNICODE

#define _tcslen  wcslen

#else

#define _tcslen  strlen

#endif

针对不属于C++标准一部分的标识符,C运行库始终为其附加下划线 前缀;

 

5.C运行库中的安全字符串函数

包含头文件StrSafe.h, 现有的每一个函数,都有一个对应的新版本的函数,前面名称相同,在最后添加一个 _s(代表secure)后缀;如:_tcscpy 对应的新函数: _tcscpy_s;

计算字符数: 使用_countof宏;

6.推荐的字符和字符串处理方式

   使用TCHAR/PTSTR, BYTE/PBYTE, TEXT或_T宏, 执行全局替换,如PTSTR替换PSTR;

7.ANSI和Unicode字符转换

  MultiByteToWideChar函数 将 多字节字符转换为宽字符串;

  WideCharToMultiByte函数则 将宽字符串转换为 多字节字符串;

 

8.导出ANSI和Unicode  DLL函数

 动态链接库中,对于一个功能的函数,如实现字符串反转 ,有ANSI和Unicode两个版本, 可以先实现 Unicode版本的字符串反转函数的工资,对于ANSI版本的函数, 只需先将其字符串转换为 Unicode字符,然后调用Unicode版的字符串反转函数, 再将结果字符串转换回 ANSI字符串;

9.判断文本是ANSI还是Unicode

 由AdvApi32.dll导出,在winbase.h中声明的IsTextUnicode函数 实现分辨 字符类型是ANSI还是Unicode, 但是结果不是百分百准确;

                

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值