找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 823|回复: 3

[图文教程] 炫语言之玩转字符串001-宽窄字节的区别及重要性

[复制链接]

50

主题

65

回帖

474

积分

超级版主

积分
474
发表于 2024-5-18 08:37:58 | 显示全部楼层 |阅读模式
本帖最后由 易团雪 于 2024-5-18 16:25 编辑

1、宽窄字节简介:
什么是宽字节,什么是窄字节?对于新手来说可能比较迷糊,其实到现在我还是迷迷糊糊的到处找资料,使用的字符串指针就是 字符型A* 英文名:char* 类型,炫语言中的字符串是 文本型A 英文名:CXTextA,内部也是对 字符型A* 英文名:char*的封装,那么这些跟宽窄字节有什么关系呢?

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

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

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

为了解决这个国际化的问题,微软在Windows操作系统中引入了宽字节的功能,即:Unicode,Unicode中规定任意一个字符都占用两个字节的存储空间,即2个字符型A 英文名:char,不管是数字或者字母,还是一个汉字 都占用2个字节。用两个字符型A 英文名:char难免不方面,所以微软直接使用一个新的类型:字符型 英文名:wchar_t

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

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

查看DLL中的导出函数可以使用 depends 这个工具来查看!
②、编译器对宽窄字节的支持:
炫语言 默认为宽字节编码=默认都是Unicode编码,当然可以在项目中进行编码的转换

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

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

4、炫语言宽窄字节数据类型:
● 窄字节对照:
英文名:char、char * 、const char *
中文名:字符型A、字符型A*、常量 字符型A*
类封装中文名:文本型A、文本型A*、常量 文本型A*
类封装英文名:CXTextACXTextA*、常量 CXTextA*
● Unicode 宽字节对照:
英文名:wchar_t、wchar_t * 、const wchar_t *
中文名:字符型、字符型*、常量 字符型*
类封装中文名:文本型、文本型*、常量 文本型*
类封装英文名:CXTextCXText*、常量 CXText*
其实这里:字符型A==文本型A,字符型==文本型。大家不要看到这么多类型感觉头大
炫语言封装好的文本型A/文本型可以更方便的操作字符串,详情请查看基础模块。

本文从网络收集并整理,如有侵权请联系删除

7

主题

38

回帖

226

积分

中级会员

积分
226
发表于 2024-5-19 18:03:27 | 显示全部楼层
谢谢教程

44

主题

168

回帖

994

积分

高级会员

积分
994
发表于 2024-5-19 21:16:14 | 显示全部楼层
很详细,谢谢!

5

主题

23

回帖

159

积分

注册会员

积分
159
发表于 2024-11-10 12:57:38 | 显示全部楼层
介绍的很详细
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|炫语言 | 炫彩界面库 | 用户所需, 正是我所做! ( 鄂ICP备2023014763号-1 )

GMT+8, 2025-4-4 11:05 , Processed in 0.071562 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表