|
|
发表于 2025-8-17 12:21:57
|
显示全部楼层
回复 6# jiavip
AI(https://ai.dangbei.com/chat/363368841281667461)给的解释:
DeepSeek-V3
VBS 字码解构与ALT编码的奥秘
您提出的问题涉及到字符编码的多个层面,确实很有趣。我来解释为什么"囍"字可以有ALT+34774和ALT+821206两种不同的输入方式。
核心原理
Asc函数返回的是Unicode代码点:在VBScript中,Asc("囍")返回的是该字符的Unicode代码点(U+559C),十进制就是34774。
Windows ALT输入法的两种模式:
ALT+数字(小键盘) :直接输入Unicode代码点(34774)
ALT+0数字(小键盘) :输入的是代码页编码(821206)
详细解释
1. Unicode编码方式 (ALT+34774)
这是直接使用Unicode代码点:
"囍"的Unicode代码点是U+559C
转换为十进制:0x559C = 5×4096 + 5×256 + 9×16 + 12 = 34774
所以ALT+34774可以直接输入这个字符
2. 代码页编码方式 (ALT+0821206)
这是Windows特有的编码输入方式:
格式:ALT+0开头,后面跟着代码页编号和字符编码
821206分解:
82:表示代码页936(GB2312)
1206:GB2312编码(0x4B06)
在GB2312中:
"囍"的编码是0x4B06
分解为区码和位码:0x4B(75区), 0x06(06位)
转换为Windows ALT编码:
代码页936 = 82
组合为:82 1206 → 821206
转换方法
从字符获取GB2312编码(821206)- Function GetGB2312AltCode(char)
- ' 使用ADODB.Stream获取GB2312编码
- Dim stream
- Set stream = CreateObject("ADODB.Stream")
- stream.Type = 2 ' Text
- stream.Mode = 3 ' Read/Write
- stream.Open
- stream.Charset = "GB2312"
- stream.WriteText char
- stream.Position = 0
- stream.Type = 1 ' Binary
- Dim bytes
- bytes = stream.Read(2) ' 读取2字节
-
- ' 计算GB2312编码
- Dim gbCode
- gbCode = AscB(MidB(bytes,1,1)) * 256 + AscB(MidB(bytes,2,1))
-
- ' 组合为Windows ALT编码格式
- GetGB2312AltCode = "82" & Right("0000" & gbCode, 4)
- End Function
- ' 使用示例
- MsgBox "囍的GB2312 ALT编码是: " & GetGB2312AltCode("囍")
复制代码 从GB2312编码(821206)还原字符- Function DecodeGB2312AltCode(altCode)
- ' 解析ALT编码
- Dim codePage, gbCode
- codePage = Left(altCode, 2)
- gbCode = Mid(altCode, 3)
-
- ' 转换为字节
- Dim byte1, byte2
- byte1 = CInt(gbCode \ 256)
- byte2 = CInt(gbCode Mod 256)
-
- ' 使用ADODB.Stream转换
- Dim stream
- Set stream = CreateObject("ADODB.Stream")
- stream.Type = 1 ' Binary
- stream.Mode = 3 ' Read/Write
- stream.Open
- stream.Write ChrB(byte1) & ChrB(byte2)
- stream.Position = 0
- stream.Type = 2 ' Text
- stream.Charset = "GB2312"
- DecodeGB2312AltCode = stream.ReadText
- End Function
- ' 使用示例
- MsgBox "821206解码结果是: " & DecodeGB2312AltCode("821206")
复制代码 总结
ALT+34774:直接使用Unicode代码点,是现代系统的标准做法
ALT+0821206:使用传统的代码页编码方式,是Windows为了兼容旧系统保留的功能
这就像您比喻的"烧开水":
ALT+34774是用现代电热水壶
ALT+821206是用老式煤炉
两者都能达到相同效果,但原理不同,后者涉及更多历史兼容性考虑。 |
|