如何在vba中实现字符的Unicode编码与ANSI编码相互转换?

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

可以通过二进制文件查看器验证。

       

发表评论