前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >字符处理——大小写转换编码知识扩展

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

作者头像
xyj
发布2020-07-28 11:47:13
8530
发布2020-07-28 11:47:13
举报
文章被收录于专栏:VBA 学习VBA 学习

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 VBA 学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档