VBA编写Ribbon Custom UI编辑器02——编码转换
时间:2022-07-23
本文章向大家介绍VBA编写Ribbon Custom UI编辑器02——编码转换,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
想要使用VBA来处理customUI.xml,必须要实现编码转换的功能。
关于编码方法的知识,建议网上找找资料看看,UTF-8与UCS2之间是有规律的,完全可以根据位移来实现编码的转换。
首先声明一些需要用到的常量:
Private Const b_1000_0000 As Byte = 128
Private Const b_1100_0000 As Byte = 192
Private Const b_1110_0000 As Byte = 224
Private Const b_1111_0000 As Byte = 240
Private Const b_0001_1100 As Byte = 28
Private Const b_0000_0111 As Byte = 7
Private Const b_0000_0011 As Byte = 3
Private Const b_0011_1111 As Byte = 63
Private Const b_0000_1111 As Byte = 15
Private Const b_0011_1100 As Byte = 60
Private Const b_0000_0010 As Byte = 2
01
UTF-8转UCS2
'// UCS-2转UTF-8
'// 1 对于不大于0x007F(即00000000 01111111)的,直接把它转成一个字节,变成ASCII
'// 2 对于不大于0x07FF(即00000111 11111111)的,转换成两个字节
'// 转换的时候把右边的11位分别放到110xxxxx 10yyyyyy里边
'// 即0000 0aaa bbbb bbbb ==> 110a aabb 10bb bbbb
'// 3 剩下的会转换成三个字节,转换的时候也是把16个位分别填写到那三个字节里面
'// 即aaaaaaaa bbbbbbbb ==> 1110 aaaa 10aa aabb 10bb bbbb
Function ToUTF8(SrcUCS2() As Byte, RetUTF8() As Byte) As String
Dim ilensrc As Long
ilensrc = UBound(SrcUCS2) + 1
If ilensrc < 2 Then
ToUTF8 = "输入的UCS2字节数组太小了!"
Exit Function
End If
Dim i As Long
Dim iStart As Long
'如果是从txt文件中读取的,可能会有BOM头
If SrcUCS2(i) = &HFF And SrcUCS2(i + 1) = &HFE Then
iStart = 2
End If
If ilensrc Mod 2 Then
ToUTF8 = "输入的UCS2字节数组不是偶数!"
Exit Function
End If
ReDim RetUTF8(ilensrc / 2 * 3 - 1) As Byte
Dim p As Long
Dim tmp As Long
Dim l1 As Long, l2 As Long
For i = iStart To ilensrc - 1 Step 2
l1 = VBA.CLng(SrcUCS2(i + 1))
l2 = VBA.CLng(SrcUCS2(i))
tmp = l1 * 2 ^ 8 Or l2
If tmp <= &H7F Then
RetUTF8(p) = VBA.CByte(tmp)
p = p + 1
ElseIf tmp <= &H7FF Then
RetUTF8(p) = b_1100_0000 Or (SrcUCS2(i + 1) * (2 ^ 2)) Or (SrcUCS2(i) (2 ^ 6))
p = p + 1
RetUTF8(p) = b_1000_0000 Or (SrcUCS2(i) And b_0011_1111)
p = p + 1
Else
RetUTF8(p) = b_1110_0000 Or (SrcUCS2(i + 1) (2 ^ 4))
p = p + 1
RetUTF8(p) = b_1000_0000 Or ((SrcUCS2(i + 1) And b_0000_1111) * (2 ^ 2)) Or (SrcUCS2(i) (2 ^ 6))
p = p + 1
RetUTF8(p) = b_1000_0000 Or (SrcUCS2(i) And b_0011_1111)
p = p + 1
End If
Next
ReDim Preserve RetUTF8(p - 1) As Byte
End Function
02
UCS2转UTF-8
Function FromUTF8(SrcUTF8() As Byte, RetUCS2() As Byte) As String
Dim ilensrc As Long
ilensrc = UBound(SrcUTF8) + 1
Dim i As Long
Dim iStart As Long
'如果是从txt文件中读取的,可能会有BOM头
If SrcUTF8(i) = &HEF And SrcUTF8(i + 1) = &HBB And SrcUTF8(i + 2) = &HBF Then
iStart = 3
End If
ReDim RetUCS2(ilensrc * 2 - 1) As Byte
Dim p As Long
Dim tmp As Long
Dim b1 As Byte, b2 As Byte, b3 As Byte
i = iStart
Do While i < ilensrc
b1 = SrcUTF8(i)
i = i + 1
'UCS2 只有2个字节,只能转换3字节以下的UTF8
If b1 >= b_1111_0000 Then
FromUTF8 = "UCS2 只有2个字节,只能转换3字节以下的UTF8"
Exit Function
ElseIf b1 >= b_1110_0000 Then
'// 1110 aaaa 10bb bbbb 10cc cccc ==> aaaa bbbb bbcc cccc
'// 需要再读取2个字节
b2 = SrcUTF8(i)
i = i + 1
b3 = SrcUTF8(i)
i = i + 1
b1 = ((b1 And b_0000_1111) * 2 ^ 4) Or ((b2 And b_0011_1111) 2 ^ 2)
b2 = ((b2 And b_0000_0011) * 2 ^ 6) Or (b3 And b_0011_1111)
ElseIf b1 >= b_1100_0000 Then
'// 110a aaaa 10bb bbbb ==> 0000 0aaa aabb bbbb
'// 需要再读取1个字节
b2 = SrcUTF8(i)
i = i + 1
b2 = ((b1 And b_0000_0011) * 2 ^ 6) Or (b2 And b_0011_1111)
b1 = (b1 And b_0011_1111) 2 ^ 2
Else
'// 0aaa aaaa ==> 0000 0000 0aaa aaaa
b2 = b1
b1 = 0
End If
RetUCS2(p) = b2
RetUCS2(p + 1) = b1
p = p + 2
Loop
ReDim Preserve RetUCS2(p - 1) As Byte
End Function
- JDBC为什么要使用PreparedStatement而不是Statement
- tcpdump捕捉样例
- Log4j详细使用教程
- Android系统线控和歌曲信息屏显的那点事
- 利用Spring中同名Bean相互覆盖的特性,定制平台的类内容。
- 关于java传参
- 浅析ButterKnife
- SQL Server常用语句
- pyecharts(一):Python可视化利器
- 如何在Python中保存ARIMA时间序列预测模型
- SVN+Apache域用户认证配置方法_Windows(转,重新排版,部分内容更新优化)
- sum(x) over( partition by y ORDER BY z ) 分析
- Android DataBinding 数据绑定
- Flask拾遗笔记之上下文
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP单例模式应用示例【多次连接数据库只实例化一次】
- 踩坑:pytorch中eval模式下结果远差于train模式介绍
- Python读取二进制文件代码方法解析
- Python3 webservice接口测试代码详解
- php往mysql中批量插入数据实例教程
- PHP类与对象后期静态绑定操作实例详解
- PHP后期静态绑定之self::限制实例分析
- PHP获取星期几的常用方法小结
- PyTorch-GPU加速实例
- Spring @Enable模块驱动原理及使用实例
- 关于python的缩进规则的知识点详解
- php 处理png图片白色背景色改为透明色的实例代码
- PHP设计模式之模板模式定义与用法详解
- yii2 url重写并隐藏index.php方法
- PHP设计模式之模板方法模式实例浅析