|
在易语言中:常识:只有一种文本型,可以存储ANSI文本内容和UTF8文本内容,易语言的文本型变量内本质是一个内存地址,地址指向一段内存区域用于存放文本数据,在数据末尾用字节0标识文本结束。
小知识:假设文本数据末尾遇不到字节0,程序就会出现异常崩溃,因为代码会一直寻找到字节0才结束,当寻找长度超出该内存块长度就相当于溢出了,再继续将出现无法预料的BUG。之所以这样就是因为文本型本身不存储数据长度。前面说可以存储UTF8,因为UTF8也是以字节0作为结束标识,但实际上易语言中的各种库和模块自身只认为文本型是ANSI编码,实际操作中还是存在问题的。
在炫语言中:
常识:由于是基于C++的,所以有字符型、字符型A、文本型、文本型A四种文本型数据类型
字符型 :存储一个字符(两个字节,通常用于UTF16字符),可以定义为数组来存储固定长度文本
字符型A:存储一个字符(一个字节,通常用于ANSI字符和UTF8字符),可以定义为数组来存储固定长度文本
文本型:存储一段(字符型为单位)文本内容,属于面向对象的类,提供多种文本常用处理方法(实际数据末尾无需用字节0结束)
文本型A:存储一段(字符型A为单位)文本内容,属于面向对象的类,提供多种文本常用处理方法(实际数据末尾无需用字节0结束)
在易语言中的【文本型】等同于炫语言中的【字符型A*】,字符型A带星号表示这是一个C++的指针变量,意思是这个变量本身是直接指向内存地址的,因此这里的字符型A代表的是目的内存中的一段文本数据了,不仅仅是单个字符。
这里分享一个最近遇到的比较坑实际案例:
这是一个模仿易语言中外部编辑框_取行文本的炫语言代码,这里定义的是字符型数组(【字符型】数组作为参数时相当于【字符型*】),事实上这段代码和很多易语言代码中的外部编辑框_取行文本都存在一个错误的操作。
分析:这里的196时指的EM_GETLINE窗口消息,用于获取编辑框指定行的文本,消息参数1代表具体行数,消息参数2代表接收返回的文本的地址,以精易模块为例,再调用时我们都是先申请一段空白文本,然后取地址作为参数2,并且这种操作大多数情况居然是没有任何问题的。我们来看看微软官方文档对参数2的解释:
指向接收行副本的缓冲区的指针。 在发送消息之前,将此缓冲区的第一个单词设置为缓冲区的大小(以 TCHAR为单位)。 对于 ANSI 文本,这是字节数;对于 Unicode 文本,这是字符数。 第一个单词中的大小被复制的行覆盖。 文档中明确说明,接收的文本缓冲区第一个字符(可能是单字节Ansi,双字节Unicode)必须先用来设置缓冲区的长度,之所以大家平时在易语言中使用错误用法都没出问题,实际上是我们易语言中的【取空白文本】是在文本缓冲区填充的非字节0的空白字符,而这个非字节0刚好碰巧成为了一个无意中指定的长度。(两个BUG在一起负负得正 |
评分
-
查看全部评分
|