字符处理——大小写转换编码知识扩展

2020-07-28 11:47:13 浏览数 (1)

前面实现的字符处理,大小写转换是使用了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函数返回的内容就是一样的。

0 人点赞