1.简介

一直以来,我们将文本字符串编码成一组以0结尾的单字节字符,调用strlen,它就会返回“以0结尾的一个ANSI单字节字符数组”的字符数。

但是,某些语言文字系统(如韩文)的字符集有非常多的符号,一个字节最多能表示256个符号,这是远远不够的;为了支持这些语言文字系统,双字节字符集出现了。双字节字符集中,一个字符串中的每个字符都由1个或2个字节组成。

2.Unicode编码

UTF全称是Unicode Transformation Format(Unicode转换格式),有以下几种格式。

  • UTF-8:将一些字符编码为1个字节、2个字节、3个字节、4个字节,相当流行的编码格式。
  • UTF-16:将每个字符编码为2个字节。
  • UTF-32:将每个字符都编码为4个字节。

3.ANSI字符和Unicode字符

C语言用char数据类型表示一个8位的ANSI字符。如下:

char c = 'A';char buffer[100] = "string";

微软的C/C++编译器定义了一个内建的数据类型wchar_t,表示一个16位的Unicode(UTF-16)字符。默认情况下,在vs中新建一个项目时,编译器会打开/Zc:wchar_t的开关,我们才能够正常使用这个数据类型。

声明Unicode字符和字符串的方法。如下:

wchar_t c = L'A';wchar_t buffer[100] = L"string";

字符串之前的大写字母L通知编译器该字符串应当编译为一个Unicode字符串。

为了与C语言区分,Windows希望定义了自己的数据类型。如下所示:

typedef char CHAR;typedef wchar_t WCHAR;    // wc,   16-bit UNICODE character

除此之外,还定义了大量方便的数据类型。如下所示:

typedef CHAR *PCHAR, *PSTR;
typedef CONST CHAR *PCSTR;typedef WCHAR *PWCHAR, *PWSTR;
typedef CONST WCHAR *PCWSTR;

另外,在写代码的时候,可以使用ANSI或Unicode字符/字符串使能够通过编译。定义了以下类型的宏:

#ifdef  UNICODE                     // r_winnttypedef WCHAR TCHAR, *PTCHAR,PTSTR;
typedef CONST WCHAR *PCTSTR;#define __TEXT(quote) L##quote      // r_winnt#elsetypedef CHAR TCHAR, *PTCHAR,PTSTR;
typedef CONST CHAR *PCTSTR;#define __TEXT(quote) quote      // r_winnt#endif /* !_TCHAR_DEFINED */#define TEXT(quote) __TEXT(quote)

利用这些类型和宏,无论使用ANSI还是Unicode字符,都能通过编译。

TCHAR c = TEXT('A');TCHAR buffer[100] = TEXT("string");

4.Windows中的Unicode函数和ANSI函数

如果一个Windows函数的参数列表中有字符串,则通常有两个版本。例如:CreateFile

WINBASEAPI
HANDLE
WINAPI
CreateFileA(_In_ LPCSTR lpFileName,_In_ DWORD dwDesiredAccess,_In_ DWORD dwShareMode,_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,_In_ DWORD dwCreationDisposition,_In_ DWORD dwFlagsAndAttributes,_In_opt_ HANDLE hTemplateFile);WINBASEAPI
HANDLE
WINAPI
CreateFileW(_In_ LPCWSTR lpFileName,_In_ DWORD dwDesiredAccess,_In_ DWORD dwShareMode,_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,_In_ DWORD dwCreationDisposition,_In_ DWORD dwFlagsAndAttributes,_In_opt_ HANDLE hTemplateFile);

CreateFileA:接受ANSI字符串。

CreateFileW:接受Unicode字符串。W代表wide

返回字符串长度的函数:

#ifdef UNICODE
#define _tcslen wcslen
#else
#define _tcslen strlen
#endif

5.新的安全字符串函数

现有的字符串处理函数如_tcscpy等已被标记位废弃不用。现在它们都对应了一个新版本的函数,前面名称相同,最后加了一个_s后缀。示例:

    TCHAR before[3] = { TEXT('A'),TEXT('B') ,'\0'};TCHAR after[3] = { TEXT('-'),TEXT('-') ,'\0'};errno_t result = _tcscpy_s(after, _countof(after), before);

6.处理字符串的函数

除了新的安全字符串函数,C运行库还新增了一些函数,用于在执行字符串处理时提供更多控制。自然,这些函数提供了ANSI(A)版本和Unicode(W)版本。

    StringCchCat(PTSTR pszDest, size_t cchDest, PTSTR pszSrc)StringCchCopy(PTSTR pszDest, size_t cchDest, PTSTR pszSrc)

在这些方法中,都含有一个“Cch”,这表示Count of characters,即字符数;通常使用_countof来获取值。

另外还有一系列的名称中含有“Cb”的函数,比如StringCbCat、StringCbCopy,这些函数要求用字节数来指定大小,通常使用sizeof来获取值。

还有一些末尾加了Ex的函数,表示可扩展的版本,例如StringCchCatEx、StringCchCopyEx。

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

最好将应用程序转换为支持Unicode的形式。

  • 用通用的数据类型(TCHAR/PTSTR)表示文本字符和字符串。
  • 用BYTE和PBYTE表示字节、字节指针和数据缓冲区。
  • 用TEXT或_T宏来表示字面常量字符和字符串。
  • 修改与字符串有关的计算。例如:我们需要知道缓冲区大小的字符数,而不是字节数,应该调用_countof(buffer),而不是sizeof(buffer)。
  • 执行全局替换。例如:用PTSTR替换PSTR。

以下为使用Unicode的好处:

  • 有利于应用程序本地化。
  • 只需发布一个二进制文件,即可支持所有语言。
  • 提升应用程序效率,代码执行速度更快,占用内存更少。Windows内部的一切工作都是使用Unicode字符和字符串来进行的。如果使用ANSI字符和字符串,Windows就会被迫分配内存,将ANSI字符或字符串转为Unicode。
  • 应该程序能够调用所有尚未弃用的Windows函数,因为一些Windows函数只提供处理Unicode的字符和字符串。
  • 应用程序代码很容易与COM集成。
  • 应用程序代码很容易与.NET Framework集成。

8.Unicode与ANSI字符串转换

//将多字节的字符串转换为宽字符字符串
MultiByteToWideChar(_In_ UINT CodePage,_In_ DWORD dwFlags,_In_NLS_string_(cbMultiByte) LPCCH lpMultiByteStr,_In_ int cbMultiByte,_Out_writes_to_opt_(cchWideChar,return) LPWSTR lpWideCharStr,_In_ int cchWideChar);//将宽字符字符串转换为多字节字符串
WideCharToMultiByte(_In_ UINT CodePage,_In_ DWORD dwFlags,_In_NLS_string_(cchWideChar) LPCWCH lpWideCharStr,_In_ int cchWideChar,_Out_writes_bytes_to_opt_(cbMultiByte,return) LPSTR lpMultiByteStr,_In_ int cbMultiByte,_In_opt_ LPCCH lpDefaultChar,_Out_opt_ LPBOOL lpUsedDefaultChar);

Windows字符和字符串处理相关推荐

  1. 字符与字符串操作——Windows via C/C++

    在最新版的Windows, Windows Vista,它应该支持Unicode 5.0.在编程中对字符与字符串的操作是很普通的,为新的系统写代码,尽可能使用Unicode,它提供了更好的性能,以及可 ...

  2. c++ 字符串合并_C语言输入字符和字符串(所有函数大汇总)

    C语言输入字符和字符串(所有函数大汇总) C语言有多个函数可以从键盘获得用户输入,它们分别是: scanf():和 printf() 类似,scanf() 可以输入多种类型的数据. getchar() ...

  3. php 截取某个字符,PHP_php截取指定2个字符之间字符串的方法,本文实例讲述了php截取指定2个 - phpStudy...

    php截取指定2个字符之间字符串的方法 本文实例讲述了php截取指定2个字符之间字符串的方法.分享给大家供大家参考.具体如下: 在php中只要判断字符串1与字符串2之前的一个stripos位置然后再使 ...

  4. 字符、字符串和文本的处理之String类型

    .Net Framework中处理字符和字符串的主要有以下这么几个类: (1).System.Char类 一基础字符串处理类 (2).System.String类 一处理不可变的字符串(一经创建,字符 ...

  5. c++实现含有中文字符的字符串逆转,如:“我是小萌新”转换成“新萌小是我”

    一个中文字符占两字节,所以逆转也得两两字符进行逆转,如上图 可得出0和8,1和9,2和6,3和7进行下标交换 由此可得出以下代码: #include <iostream> #include ...

  6. C语言输入字符和字符串

    在C语言中,有多个函数可以从键盘获得用户输入: scanf():和 printf() 类似,scanf() 可以输入多种类型的数据. getchar().getche().getch():这三个函数都 ...

  7. 正则的实例用法,删除包含某些字符的字符串

    a=re.findall('[a-z]system[a-z]', ': Control_7_ CodeSystem: GroupCodeSystem: IdSystem:'.lower()) re.s ...

  8. MySQL 学习笔记(12)— 数据类型(定长字符、变长字符、字符串大对象、数字类型、日期时间类型、二进制类型)

    MySQL 常见的数据类型有字符串类型.数字类型.时间类型.二进制类型.具体的分类如下图: 1. 字符串类型 字符串类型用于存储字符和字符串数据,主要包含三种具体的类型:定长字符串.变长字符串以及字符 ...

  9. java.sql.Exception:setString 只能处理少于 32766 个字符的字符串

    java.sql.Exception:setString 只能处理少于 32766 个字符的字符串 解决方式是 : 升级ojdbc的版本,   将原来的 ojdbc14_10.2.0.2.0.jar ...

  10. 《C#精彩实例教程》小组阅读07 -- C#字符与字符串

    本微信图文详细介绍了C#中的字符与字符串.

最新文章

  1. 简单的图片处理servlet
  2. opencv进阶学习笔记7:直方图,直方图均衡化,直方图比较,直方图反向投影
  3. Python文件夹与文件的操作
  4. JAVA不同类型数组重载_java学习笔记--java中的方法与数组
  5. youleb多风格响应式博客wordpress主题模板
  6. 网站底部添加访客阅读次数总访问量在线人数代码
  7. 奔跑中的2015--成长之路
  8. 驳文不看文,实在可怕
  9. Redis 3.2.4编译安装
  10. 几种常用的JSON解析工具的使用
  11. linux学习教程:Vim编辑器和恢复ext4下误删除文件-Xmanager工具
  12. JSON Editor Online
  13. 看动图,读懂光纤通信背后的原理!
  14. 知识图谱在教育行业的应用
  15. Bootstrap框架快速上手
  16. java二重积分_对比较简单点的二重积分的做题方法
  17. IOS设置时间不兼容解决方案
  18. 电信光猫获取超级管理员密码
  19. sqlserver查询时间范围
  20. mariadb Galera集群部署

热门文章

  1. 笔记本电脑禁用/启用自带键盘
  2. 二年级语文备课组集体备课观摩活动
  3. iOS部分版本默认没有允许 app 访问蜂窝移动数据
  4. 小程序进入首页时弹出广告
  5. LCP 19. 秋叶收藏集(C++)---动态规划解题
  6. 车上控制器中英文对照
  7. linux系统下头文件、库文件搜索路径总结
  8. Android tips(十)--允许模拟位置在Android M下的坑
  9. 常用的URL Scheme [不断更新种]
  10. 时空数据库中的轨迹数据压缩