VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 3624|回复: 49
打印 上一主题 下一主题

《实用VC编程之玩转字符串》第1课:宽窄字节的区别及重要性

[复制链接]
51_avatar_middle
跳转到指定楼层
1#
online_admins 发表于 2018-12-12 22:24:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1、宽窄字节简介:
什么是宽字节,什么是窄字节?对于新手来说可能比较迷糊,我当初学习的时候也是这样!之前学习了C语言/C++语言,使用的字符串指针就是 char* 类型,C++中的字符串是 string,内部也是对 char* 的封装,那么这些跟宽窄字节有什么关系呢?

其实最早的系统都是窄字节的,也就是我们很常用的 char 因为都是英文的,英文本身就26个字母,再加上其他的一些标点符号之类的,char 也能表示的下,无符号的 char 最多能表示 255个字符,对吧,所以足够用了!

随着,操作系统的国际化,比如:Windows 系统不仅有英文的,也有中文的,韩文的,日文的,所以原来用一个 char 来表示一个英文字符的方式已经无法表达中文的一个汉字了。汉字是很多的,好几万个,单纯的 char 的取值范围已经无法表达的下了。这时候有大牛就想到了,既然用一个char表示不下,那么就用2个char来表示一个汉字,这样就可以解决了,所以窄字节的表示方法就是数字、字母之类的仍然用一个char来表示,一个汉子或者全角字符使用2个 char 来表示。

没错,这样可以解决大多数问题,在中文的系统上能正常的显示中文,在日文的系统上也能正常的显示日文,但是如果把一个在中文系统上写的软件,界面上带有汉字的程序拿到一个日文的Windows操作系统上就会有问题了,乱码了,汉字无法正常显示,同理,把一个界面上带有日文或者韩文的软件拿到中文的系统上也显示乱码!

为了解决这个国际化的问题,微软在Windows操作系统中引入了宽字节的功能,即:Unicode,Unicode中规定任意一个字符都占用两个字节的存储空间,即2个char,不管是数字或者字母,还是一个汉字 都占用2个字节。用两个char难免不方面,所以微软直接使用一个新的类型:wchar_t,大家看起来比较陌生,不过他的原型实际上就是 unsigned short,这个大家比较熟悉吧,占用2个字节的存储空间。

所以,微软就是利用Unicode编码来解决这个国际化的问题!

2、操作系统及VS编译器对宽窄字节的编码支持:
①、Windows操作系统提供了两种类型的 API 函数,例如 MessageBox 函数,其实 MessageBox 他只是一个宏,他对应的两个版本的函数分别为:MessageBoxA 和 MessageBoxW,你在VS编译器中使用的时候系统会根据是否定义了_UNICODE 宏来进行判断当前工程使用的是宽字节的Unicode编码还是窄字节编码,根据这个来决定该使用哪个版本的函数!如果你的工程没有定义 _UNICODE 宏,也就是非Unicode编码,那么就使用窄字节的 MessageBoxA,如果定义了,那么就使用宽字节的 MessageBoxW,具体在代码中,右键找定义,见演示!

查看DLL中的导出函数可以使用 depends 这个工具来查看!

备注:Windows 2000 及其以后的 Xp、2003、Vista、Win7、Win8、Win10 等系统都是使用Unicode从头进行开发的,如果调用任何一个Windows API 函数并给它传递一个 ANSI 字符串,那么系统首先要将字符串转换成Unicode,然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串,系统就会先将Unicode字符串转换成ANSI字符串,然后将结果返回给你的应用程序。进行这些字符串的转换需要占用系统的时间和内存。通过从头开始用Unicode来开发应用程序,就能够使你的应用程序更加高效的运行!

②、编译器对宽窄字节的支持:
VC++ 6.0 默认为窄字节编码,vs2005、vs2008、vs2010、vs2012、vs2013、vs2015、vs2017 等默认都是Unicode编码,当然可以进行工程的设置从而进行编码的转换,见演示!
备注:从vs2013开始,如果要让工程从默认的Unicode编码转到窄字节编码,需要安装vs2013的多字节补丁才行!
具体在工程的属性对话框中的如下位置可更改编码类型:
《实用VC编程之玩转字符串》第1课:宽窄字节的区别及重要性

3、宽窄字符串的优缺点:
上面说了那么多,可能大家认为既然 Unicode 这么好,那以后我程序当中所有的字符串就都用Unicode的宽字节就行了吧?实际也不是的,宽字节也有缺点!
一般来说只是涉及到界面,或者是跟字符串操作相关的建议大家使用宽字节,其他地方还是可以用窄字节。因为宽字节的占用空间比窄字节多了一倍,所以如果是单纯在本机的话还好,如果是进行字符串的网络传输,那么传输量就会是窄字节的二倍,所以这块也不是说什么时候都一味的用Unicode宽字节。

那么,既然在同一个工程代码中,有的地方用宽字节,有的地方用窄字节,那么怎么来统一呢,这个时候肯定要进行宽窄字节的一个转换的工作了,不过还好,有多种方法可以进行转换,微软也为我们提供好了相应的 API 函数,我们直接拿过来用就可以了。关于转换这块我们之后会讲解的!

4、复杂的宽窄字节数据类型:
刚开始学编程的时候我们就接触了 char、char* 之类的,属于窄字节的,按照刚刚讲的,又多了一个 wchar_t 类型的字符,字符串指针的话就可以是 wchar_t* 类型。但是,在我们平时的编程过程中还会见到很多其他的复杂类型,如下:
● 窄字节:
char、char * 、const char *
CHAR、(PCHAR、PSTR、LPSTR)、LPCSTR

● Unicode 宽字节:
wchar_t、wchar_t * 、const wchar_t *
WCHAR、(PWCHAR、PWSTR、LPWSTR)、LPCWSTR

● T 通用类型:
TCHAR、(TCHAR * 、PTCHAR、PTSTR、LPTSTR)、LPCTSTR

其中:P代表指针的意思,STR代表字符串的意思,L是长指针的意思,在WIN32平台下可以忽略,C代表const常量的意思,W代表wide宽字节的意思,T大家可以理解为通用类型的意思,
就是可以根据工程中是否定义_UNICODE 宏,来判断当前工程的编码类型是宽字节还是窄字节,之后分别定义成不同的类型,比如:TCHAR 类型,如果工程中定义了_UNICODE 宏,那么就表明工程是宽字节编码,他最终就被定义成 wchar_t 类型,如果工程中没有定义_UNICODE 宏,就表明工程当前是窄字节编码,那么 TCHAR 被最终定义成 char 类型。

〓※※※〓 其方便性就是修改了工程的编码格式之后不用修改代码,所以还是建议大家在编写程序的时候使用通用类型!

5、小作业:
大家回去查查,如何使用宽字节字符串进行字符串的拷贝工作?默认我们以前使用 strcpy 来进行字符串的拷贝,那么宽字节呢?

备注:相关课程细节及演示详见视频教程!



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
教程在线观看地址:
https://www.bilibili.com/video/av38413272/?p=1
MP4高清视频下载地址:链接:https://pan.baidu.com/s/1ZyzGGTWJ98XoESnhbI-XfQ 提取码:85h8
本节课件下载(回复后可见):
游客,如果您要查看本帖隐藏内容请回复

备注:VIP会员可免费下载本站所有资源(点击查看)
提示:通过购买VC驿站U盘打包(点击查看)也可加入终身Vip会员^_^

评分

参与人数 1驿站币 +1 热心值 +1 收起 理由
02_avatar_small Dvol + 1 + 1 支持原创!

查看全部评分





下一篇:《实用VC编程之玩转字符串》第2课:宽窄字节字符串的使用
02_avatar_middle
2#
在线会员 发表于 2018-12-12 23:11:09 | 只看该作者
好期待,新课又开了
81_avatar_middle
3#
在线会员 发表于 2018-12-13 09:44:43 | 只看该作者
xuexi学习学习
81_avatar_middle
4#
在线会员 发表于 2018-12-13 20:50:21 | 只看该作者
老大,网站公布了吗
51_avatar_middle
5#
ico_lz  楼主| 发表于 2018-12-13 23:53:48 | 只看该作者
沉浮AA 发表于 2018-12-13 20:50
老大,网站公布了吗

教程已上传!
81_avatar_middle
6#
在线会员 发表于 2018-12-14 08:04:03 | 只看该作者
宝贵经验啊,很值得学习
87_avatar_middle
7#
在线会员 发表于 2018-12-14 14:22:30 | 只看该作者
老大的一定支持
32_avatar_middle
8#
在线会员 发表于 2018-12-14 21:16:39 | 只看该作者
Thanks for sharing!
08_avatar_middle
9#
在线会员 发表于 2018-12-15 18:19:10 | 只看该作者
《实用VC编程之玩转字符串》第1课:宽窄字节的区别及重要性《实用VC编程之玩转字符串》第1课:宽窄字节的区别及重要性《实用VC编程之玩转字符串》第1课:宽窄字节的区别及重要性
69_avatar_middle
10#
在线会员 发表于 2018-12-15 21:06:04 | 只看该作者
《实用VC编程之玩转字符串》第1课:宽窄字节的区别及重要性谢谢楼主分享
02_avatar_middle
11#
在线会员 发表于 2018-12-16 00:00:52 | 只看该作者
《实用VC编程之玩转字符串》第1课:宽窄字节的区别及重要性《实用VC编程之玩转字符串》第1课:宽窄字节的区别及重要性《实用VC编程之玩转字符串》第1课:宽窄字节的区别及重要性
10_avatar_middle
12#
在线会员 发表于 2018-12-17 16:26:10 | 只看该作者
开始学习,不要停下。
31_avatar_middle
13#
在线会员 发表于 2018-12-18 07:04:54 | 只看该作者
谢谢楼主分享
04_avatar_middle
14#
online_vip 发表于 2018-12-19 21:36:00 | 只看该作者
又学到技术了,谢谢老大
78_avatar_middle
15#
在线会员 发表于 2018-12-20 08:32:03 | 只看该作者
又出新课。不错,谢谢
95_avatar_middle
16#
在线会员 发表于 2018-12-21 08:32:45 | 只看该作者
感谢老大分享
21_avatar_middle
17#
在线会员 发表于 2018-12-22 10:07:02 | 只看该作者
感谢老大制作字符串系列课程并分享!
87_avatar_middle
18#
online_vip 发表于 2018-12-24 10:55:20 | 只看该作者
如何使用宽字节字符串进行字符串的拷贝工作?默认我们以前使用 strcpy 来进行字符串的拷贝,那么宽字节呢?
37_avatar_middle
19#
online_vip 发表于 2018-12-27 20:07:20 | 只看该作者
学习基础知识。
01_avatar_middle
20#
online_vip 发表于 2018-12-29 10:16:27 | 只看该作者
老大出品,必属精品
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-10-15 03:50

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表
时时彩平台排名