前面实现的字符处理,大小写转换是使用了VBA内置函数实现的,如果不使用VBA的UCase和LCase函数,我们如何完成大小写转换?
字母,在计算机内存的存储中,只是一些"01"的东西,在文件操作——编码中说到过。
所以,字母的大小写转换,其实只要改变他的编码就可以,通过查看ASCII编码可以知道,小写字母是连续的、大写字母也是连续的。
所以,同一个字母,大小写的编码相差的数字是固定的,就是相差32,那么通过改变编码的方式实现字母大小写转换就容易了:
代码语言:javascript复制Sub MyUcase()
Dim str As String
str = "a"
Debug.Print VBA.Chr(VBA.Asc(str) - 32)
End Sub
Asc函数返回字符的ASCII编码,Chr函数返回ASCII编码对应的字符。
如果是转换为小写字母,那么就是加32。
转换之前其实还应该判断字符是不是需要的大写、或者小写字母:
代码语言:javascript复制Sub MyUcase()
Dim str As String
str = "A"
If str >= "a" And str <= "z" Then
Debug.Print VBA.Chr(VBA.Asc(str) - 32)
Else
Debug.Print "不是小写字母"
End If
End Sub
字符串的比较,其实也就是根据编码进行判断数字大小来确定的,因为在VBA里,使用的是Unicode编码,2个Byte表示一个字符,中文字符一定会大于英文字符,因为英文字符数字范围是0-255,而中文字符都是大于255的。
如果对中文字符使用Asc函数的话,会出现什么:
代码语言:javascript复制Sub TestAsc()
Dim str As String
str = "中"
Dim b() As Byte
b = str
Debug.Print VBA.Hex(b(0)), VBA.Hex(b(1))
'低位在前,高位在后
Debug.Print &H4E2D
Debug.Print VBA.Hex(VBA.Asc(str))
b = VBA.StrConv(b, vbFromUnicode)
Debug.Print VBA.Hex(b(0)), VBA.Hex(b(1))
End Sub
输出:
2D 4E
20013
D6D0
D6 D0
以前说过,VBA里String和Byte数组的转换是很简单的,直接用等号就可以,因为String的底层就是Unicode(2字节)的Byte数组,所以第一行的输出说明字符中的Unicode编码是2D4E,作为整数输出就是20013,也就是前面说的中文都是大于255的情况。
使用Asc输出的是D6D0,这个是什么呢?
Asc函数返回的其实是ANSI编码,对于英文字符那些,就是ASCII编码,而对于中文其实是GB2312编码,这个编码和VBA使用的Unicode编码是不一样的。
第4行的输出,我们使用StrConv函数,将Byte数组的内容,也就是Unicode编码转换为了ANSI编码,所以输出的和Asc函数返回的内容就是一样的。