VFB字符类型
(2022-07-08 15:52:27)
标签:
vfb |
分类: VisualFreeBasic |
String类型是字节数组
最后要说的是
函数库有关控件和AFX***
开头的等函数有字符的,参数和返回都是CWStr字符
从VFB5.2.6开始,已经对CWStr字符改造,A字符和W字符变量不发生任何转换问题(不排除复杂代码下的字符串拼接可能发生问题)。
已经打造CWStr
平常我们编程并不需要关心字符到底是什么类型,就知道文字即可,但是很多地方需要我们了解清楚,才能更好的编程。
当你写的软件在英文系统中运行,发现中文显示乱码了,或字符+字符变乱码等情况,需要我们了解FreeBasic的字符特性,才能避免发生类似情况。
在 Visual Basic 6
在 VisualFreeBasic 中,字符类型有2种,如:String
Visual Basic 6 的字符是属于
VisualFreeBasic
来到 VisualFreeBasic 中,我们有足够的自由选择,我们用什么,但自由也是有代价的,我们必须清晰的了解2种字符,才能更好的编程。
字符分为:ANSI
有关类型说明可以百度查询,这里不解释了。
内存结构
-
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字符的变长字符类型,随便装多少个字符,系统根据字符大小分配内存给它。
字符串操作语句:LeftMid 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字符=
用户工程里代码中的字符类型
zw =
"字符"
这取决于工程属性中最后选项:
默认没选,因此是 A字符类型,选择后就是 W字符类型了。
因此赋值给变量和连接字符时要注意类型,不同类型连接会发生意外情况。
VFB库文件里的字符类型
系统标准自带的库文件全部按照 ANSI 保存的文件,因此代码中的文本全部是 ANSI
类型,不管你工程选择了 W字符还是没选,都是 A字符。
当然你也可以改变它,变成 W字符编译,就是把文件保存为 UTF8 格式即可。为了避免出错,还是不要改好。
字符串转义
有些字符无法输入,无法显示,那么可以用转义输入,格式是:!"abcd"
如:换行 !"\r\n"
在A模式里使用W字符
就是工程属性没选择Unicode
模式,部分字符需要W字符类型,这可以实现。
1,用转义法:!"\u0065中文"
2,如果有参数是宽字符,那么直接用 "中文" ,这字符一定就是W字符类型。如:MessageBox(0 ,"中文"
3,最土笨就是: Wchr(xx)
假如想在Unicode 模式下需要用 A字符,那没办法,没有,除了 chr(xx) 。
总结:A字符和W字符
尽量不可以混用,不然会发生意外
在工程属性中选择 U模式后,你代码中就使用
没选U模式就用
使用API有关字符的,全部默认为 W字符
例题:PostMessage
在【工程】中【特殊函数】里【起始模块】有个