惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
小众软件
小众软件
WordPress大学
WordPress大学
Microsoft Azure Blog
Microsoft Azure Blog
Recent Announcements
Recent Announcements
博客园 - 三生石上(FineUI控件)
博客园_首页
N
Netflix TechBlog - Medium
IT之家
IT之家
H
Help Net Security
博客园 - 聂微东
Google DeepMind News
Google DeepMind News
罗磊的独立博客
T
Tailwind CSS Blog
F
Fortinet All Blogs
Hugging Face - Blog
Hugging Face - Blog
MongoDB | Blog
MongoDB | Blog
V
V2EX
量子位
云风的 BLOG
云风的 BLOG
爱范儿
爱范儿
博客园 - 司徒正美
The Cloudflare Blog
Engineering at Meta
Engineering at Meta

博客园 - coderlee

SysListView32 的使用资料 使用ThinkPHP的一些小经验 Windows操作系统中的I/O(读/写 输入/输出) 记下来 关于InitCommonControls() windows内核对象 笔记 ie6的一个css的BUG MSSQL 注入资料总结 sql 高级注入【转载 国外某牛人写的】 MYSQL 注入资料总结 Access SQL 注入指南 Ver0.2.1 上传文件与文本编辑器的那点破事:冗余与管理 xss,csrf入侵方式小结 站内的GET和POST 与 站外的GET与POST 记一次艰难的sql提权。 CSS需要注意的事项 PHP5的__get与__set 如何在web服务器或ftp服务器上开设VPN服务 - coderlee 有关javascript 有关xhtml和css 有关字符,字节以及编码
vc开发windows程序时的字符串问题的一个归纳(原创)
coderlee · 2009-09-29 · via 博客园 - coderlee

新手做windows开发首先的一个问题就是把字符串搞懂。

一. 字符集简史

字符是一个独立于计算机的概念,没有计算机仍然有字符,字符是文字符号,英语汉语日语还有各种标点符号都是字符。

字符串就是字符组成的数组。

早先,计算机使用一个字节来表示一个字符,字节Byte是8位无符号数字,单字节编码ASCII可以表示大小写英文与一些标点符号。

后来为了显示汉字日语等亚洲文字,制定了双字节编码,使用两个或一个字节来表示一个字符。

而且使用了代码页,两个字节在不同的代码页中,所代表的字符也是不同的,简体中文代码页是GBK,繁体中文是BIG5等等。

这样一个字符串中,既有单字节的字符,又有双字节字符,很难统计一个字符串中的字符数量。

再后来有了UNICODE,UNICODE编码体系中的UTF-16标准,规定一律使用两个字节表示一个字符,这样可以表示世界上各种语言中的字符,不用代码页进行区分了,他们在UTF-16编码系统中都有了自己的16位编码了,虽然存储空间增大了,但效率提升是明显的。

二 各种字符串处理函数库

1 C运行库对字符串的处理:

str*系列:    C运行库早期使用strlen strcpy等str*系列函数对char类型的字符串进行处理。
wcs*系列:   C编译器内置了wchar_t这个16位宽字节类型后,使用新的wcslen wcscpy等wcs*系列的函数对wchar_t类型的字符串进行处理。
_tcs*系列:  C运行库定义了宏_tcslen _tcscpy等_tcs*系列的宏定义,_tcs*系列函数在编译时根据是否预定义了宏_UNICODE而确定是采用wcs*系列函数,否则采用str*系列函数。

_tcs*_s系列:  C运行库的最新安全字符串函数,为了防止缓冲区溢出而定义的新函数。

2 windows开发团队对字符串的处理:

Windows开发团队在winnt.h中定义了新的数据类型CHAR(char), WCHAR(wchar_t), TCHAR,TCHAR最终在编译时根据是否预定义了UNICODE宏而确定是CHAR还是WCHAR。

lstr*a系列:  在windows操作系统的Kernel32.dll中定义,处理CHAR类型的字符串,其实是对lstr*w的一层包装。
lstr*w系列: 在windows操作系统的Kernel32.dll中定义,处理WCHAR类型的字符串。
lstr*系列:   lstr*系列函数也是在编译时才根据是否预定义了UNICODE宏来确定采用lstr*a系列函数,还是lstr*w系列函数。

其实我比较常用的是lstr*系列,因为这个是windows api,这样写出来的程序可以不用把C运行库链接进来。

有个需要注意的是,C运行库的_UNICODE和Windows的UNICODE,两个宏,要么同时定义,要么同时不定义。C运行库前缀下划线是为了遵守那个该死的C++标准(对于不属于C++标准的宏加下划线),而Windows没有遵守那个标准。

========================================

尽管字符串处理看起来很乱,但是抓住一个用就可以了,虽然目前推荐的标准是_tcs*_s系列,但是大家按自己的需要来使用,没有介绍stl库和mfc库中的字符串类型,因为那两个库是C++库,不是C库。