Unicode编码字符指的是用两个字节存储一个字符。
在vba中字符就是用Unicode编码存储的,并且是按照Little-Endian存储的。
如运行以下代码,将在立即窗户中显示11 62。
Sub QQ1722187970() Dim arr() As Byte Dim s As String s = "我" arr = s For i = 0 To UBound(arr) Debug.Print VBA.Hex(arr(i)) Next i End Sub
字符“我”在VBA中第一个字节存储了十六进制值11,第二个字节存储了十六进制值62。
查找字符“我”的Unicode编码可以得知是\u6211,从而进一步验证了在vba中字符就是用Unicode编码存储的,并且是按照Little-Endian存储的。
ANSI编码指的是按照当前系统的默认代码页进行的字符编码。而对于简体中文操作系统,则一般是GB 2312编码。
比如字符“我”的ANSI编码在内存中是怎么表示的呢,可以新建一个空白文本文档,然后输入字符“我”,保存关闭(默认以ANSI编码保存)。
用二进制查看软件打开刚才新建的文本文档,可以看到字符“我”在内存中是以CE D2 两个字节存储的。如下图所示
可以看到这个ANSI编码与Unicode编码不同。
为了实现ANSI编码与Unicode编码直接的相互转换,vba内置了StrConv函数,可以轻松地在ANSI编码与Unicode编码之间相互转换。
StrConv函数的语法如下:
StrConv(string, conversion, LCID)
其中参数string表示要转换的字符,conversion参数表示转换的方式, LCID表示不同的 LCID,这个参数一般忽略。
其中conversion参数主要有以下几种:
常量 | 值 | 说明 |
vbUpperCase | 1 | 将英文字符转换为全大写的英文字符 |
vbLowerCase | 2 | 将英文字符转换为全小写的英文字符 |
vbProperCase | 3 | 将每个单词的第一个字符转为大写 |
vbWide* | 4 | 将单字节字符转换为双字节字符 |
vbNarrow* | 8 | 将双字节字符转换为单字节字符 |
vbUnicode | 64 | 将ANSI编码字符转为Unicode编码字符 |
vbFromUnicode | 128 | 将Unicode编码字符转换为ANSI编码字符 |
由于excel内部是以unicode编码存储字符的,所以ANSI编码无法正确显示出正确的字符,只能将Unicode编码字符转化为ANSI编码的内存二进制表示形式。
如以下代码是实现字符在Unicode编码字符与ANSI编码之间相互转换:
Sub QQ1722187970() Dim arr() As Byte Dim s As String s = "我和你" arr = s '先看下字符变量s的Unicode编码 For i = 0 To UBound(arr) Debug.Print VBA.Hex(arr(i)) Next i Erase arr 'Unicode编码转ANSI编码 arr = VBA.StrConv(s, vbFromUnicode) '看转换后的ANSI编码 For i = 0 To UBound(arr) Debug.Print VBA.Hex(arr(i)) Next i 'ANSI编码转Unicode编码 k = VBA.StrConv(arr, vbUnicode) MsgBox k End Sub
可以通过二进制文件查看器验证。
发表评论