加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

VFB字符类型

(2022-07-08 15:52:27)
标签:

vfb

分类: VisualFreeBasic
VFB字符类型

String类型是字节数组
最后要说的是 String  不单单就当字符类型变量用,那太浪费了。因为可以赋值任意数据,可以保存任何东西,只要你明白是装什么就是什么了,可以把它看成 byte()  数组,任何变量名  a[0]   就可以直接获取或修改 byte 值,注:是中括号[ ] 不是 ( ),如同数组一样操作。更重要的是 FreeBasic 的函数没有数组返回功能,那么 String  就作为变相的数组返回了。也可以转换一下,可以返回任何数据了。


函数库有关控件和AFX*** 开头的等函数有字符的,参数和返回都是CWStr字符 
从VFB5.2.6开始,已经对CWStr字符改造,A字符和W字符变量不发生任何转换问题(不排除复杂代码下的字符串拼接可能发生问题)。
已经打造CWStr 成为万能字符变量:
          输入(参数或赋值)可以是任何类型变量,转为W字符保存。因此当参数使用时,调用它的函数用任意变量都不会出错。
          输出  根据接收方是 A字符或W字符 自动给于相关内容,若接收方是指针(任意指针),那么永远是W字符内容的指针。赋值给数值类型则报错误。 


平常我们编程并不需要关心字符到底是什么类型,就知道文字即可,但是很多地方需要我们了解清楚,才能更好的编程。

当你写的软件在英文系统中运行,发现中文显示乱码了,或字符+字符变乱码等情况,需要我们了解FreeBasic的字符特性,才能避免发生类似情况。

在 Visual Basic 6 中 ,字符类型就1种,如:Dim S as String    衍生出定长字符 Dim S as String * 100

在 VisualFreeBasic 中,字符类型有2种,如:String  和 wString  以及 zString  (C语言也是区分2种类型,还有API也分2种)

Visual Basic 6 的字符是属于 VisualFreeBasic wString  字符,所有API也使用1种方式。

来到 VisualFreeBasic 中,我们有足够的自由选择,我们用什么,但自由也是有代价的,我们必须清晰的了解2种字符,才能更好的编程。

字符分为:ANSI 类型  UNICODE 类型,我们按照API的说法,简化为:A字符  W字符
有关类型说明可以百度查询,这里不解释了。

内存结构 :A字符 1个英文占1个字节,1个中文占2个字节, W字符不管英文中文,1个字都占2个字节。

  • String   
    A字符的变长字符类型,随便装多少个字符,系统根据字符大小分配内存给它,每次赋值重新分配内存。
    FreeBasic 内存结构是1个zString指针+字符长度,用 StrPtr来返回真正字符数据存放地址(zString指针)
    32位软件时,指针4字节+长度4字节 ,64位软件,指针8字节+长度4字节,指针在前,长度在后
  • zString * n   
    A字符的定长字符类型,预先分配最大 n 个字节内存,赋值时不会重新分配内存,因此处理速度比变长的快。
    输出显示和赋值给其它变量时遇到 chr(0)  截断,赋值超过 n-1 长度 时,就只赋值 n-1 字符。
    为何是 n-1 长度,因为需要最后1个为 chr(0) 来判断字符长度,因此你要装 1个字符,n 就必须为2 才行。
  • wString * n 
    W字符的定长字符类型,预先分配最大 n *2 个字节内存,n 是字符数,1个字符占2个内存,最后必须为 wchr(0) 结尾,因此 n 数字设为,需要保存字符数再 +1 才行。wchr(0) = chr(0,0)
  • CWStr  (因为FreeBasic 无变长的W字符,因此用扩展库的类实现)
    W字符的变长字符类型,随便装多少个字符,系统根据字符大小分配内存给它。
    字符串操作语句:Left  Mid  Right LCase UCase LTrim RTrim Trim InStr InStrRev LSet RSet 等等还有VAL,会把 CWStr 当成 String 类型处理,其内部会先转换为 String 类型后处理,因此遇到FB内部语句后就等同于A字符 String 了,想要FB内部语句认为是W字符,需要在变量名前加 ** 就可以了,例题:dim w as cwstr  print  Mid(**w,1,2)   或用 w.wstr 就百分百是 W字符。
    注: CWStr 只是个类,而非FB内置类型,任何类型赋值到 CWStr中,都会自动转换为W字符保存。赋值给其它变量,若接收方是W字符类型,就直接赋值,若是A字符则转换后赋值,若接收方是指针,则给W字符指针,若接收方是A字符指针,那么给的也是W字符指针,要小心处理。   

代码中A字符和W字符互相赋值问题

A字符= W字符   或 W字符= A字符   '此时系统会自动转换编码,会按照 工程属性里,代码页来转换

用户工程里代码中的字符类型

zw = "字符"     '有没想过,引号中的字符是 ANSI 类型 还是 UNICODE 类型呢?
这取决于工程属性中最后选项: Unicode 模式(文字为WString类型)   详细看工程属性帮助 
默认没选,因此是 A字符类型,选择后就是 W字符类型了。
因此赋值给变量和连接字符时要注意类型,不同类型连接会发生意外情况。

VFB库文件里的字符类型

系统标准自带的库文件全部按照 ANSI 保存的文件,因此代码中的文本全部是 ANSI 类型,不管你工程选择了 W字符还是没选,都是 A字符。
当然你也可以改变它,变成 W字符编译,就是把文件保存为 UTF8 格式即可。为了避免出错,还是不要改好。

字符串转义

有些字符无法输入,无法显示,那么可以用转义输入,格式是:!"abcd"    字符串前面加个英文感叹号。
如:换行 !"\r\n"    任意字符 !"\nnn"   ascii的十进制字符(必须是 3位)详细点此查看

在A模式里使用W字符

就是工程属性没选择Unicode 模式,部分字符需要W字符类型,这可以实现。
1,用转义法:!"\u0065中文"   只要有个\u ,里面字符全部按照W字符类型编译了。
2,如果有参数是宽字符,那么直接用 "中文" ,这字符一定就是W字符类型。如:MessageBox(0 ,"中文"
3,最土笨就是: Wchr(xx)   ,这也就不算代码字符了。
假如想在Unicode 模式下需要用 A字符,那没办法,没有,除了 chr(xx) 。

总结:A字符和W字符 尽量不可以混用,不然会发生意外  
在工程属性中选择 U模式后,你代码中就使用 wString CWStr  来作为字符变量类型
没选U模式就用 String zString 作为变量类型

使用API有关字符的,全部默认为 W字符
例题:PostMessage   编译器自动处理为  PostMessageW
在【工程】中【特殊函数】里【起始模块】有个   #define UNICODE   ,就默认为 W了,要是没这句,就编译器就自动处理为 PostMessageA  ,反正要么是A,要么是W, 表示此API中有关字符参数是 A还是W,

 


0

阅读 收藏 喜欢 打印举报/Report
后一篇:VFB工程属性
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有