找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 2762|回复: 13

[文本处理] 问:VBS 字码解构问题!

[复制链接]
发表于 2025-8-17 02:28:27 | 显示全部楼层 |阅读模式
此前发帖求助过 “GB2312汉字编码字,VBS转换疑问!”
http://www.bathome.net/thread-70423-1-1.html
得到一些解惑,然后自己也写了一些解构文字无聊的脚本,,,,,
这几天无聊嘛!就尝试了一些文字的加密转换,,,,,
忽然想起一个上古时候记得的生僻字字码:在任意输入发下,按住ALT+821206,松开得到文字“”,,,
然后鄙人用上次求助得到的法子,解构“”字,,,得出字码,,34774
也就是说,,按住ALT+34774,松开得到文字“”,,,
----------------------------
解字,,,运行,,
  1. Mshta "Vbscript:Msgbox(Asc("囍")+65536) & Window.Close"
复制代码
-----------------
解码,,,运行,,
  1. Mshta "Vbscript:Msgbox(chr(34774)) & Window.Close"
复制代码
-------------------
疑问就在这里:为什么 按住ALT+821206,松开一样可以得到文字“”,,,
这个帖子的疑问就好比:同样是把水烧开,有的是用柴火烧开的,有的却是用可控核聚变,(能源的尽头是烧开水),,,,
现在比人已知把水烧开的其一方法,按住ALT+34774 是用柴火,把水烧开的, ,,
那么求问:按住ALT+821206,,,,,,是用什么可控核聚变把水烧开的?,,,,
然后用什么方法,把“”,,转换成字码 821206 ,,,
如果能解释一下,利用的是什么玄学,修真,代码最好,,,,,
希望,网页开发类的大神不吝赐教,解惑,,,,,,,,
发表于 2025-8-17 08:44:23 | 显示全部楼层
本帖最后由 idwma 于 2025-8-17 08:48 编辑

821206只取前16位吧,不算17-20位的1100,就变成34774了
 楼主| 发表于 2025-8-17 09:27:44 | 显示全部楼层
回复 2# idwma


    不是吧,,哥,,,,
鄙人上文虽说听闻过一些玄学代码,,结果你就扔过我一个修真样品。,,
你还不如在电话里告诉我:先这样这样,然后再那样那样,最后就是这个样子。,,

其实我略微猜到一些,,
34774 + 65536 × 12 = 821206
这个 十六进制的12倍,,搞不清楚它在系统表达里有什么说法!,,
,,,
,,
别扔修真秘籍了啊,最起码先告诉我丹田在哪,再告诉我吸气吐纳。,
别一来就,,斗罗强者恐怖如斯,,,,
发表于 2025-8-17 10:06:36 | 显示全部楼层
就是汉字的GBK编码,汉字是双字节的编码
vbs用&H前缀表示16进制数
34774 = &H87D6
821206 = &HC87D6
汉字是双字节的编码,所以 821206 = &HC87D6 只取后四个数 = &H87D6
可以验证一下
&HD87D6  = 886742
Alt + 小键盘886742 = 囍
发表于 2025-8-17 10:07:56 | 显示全部楼层
那这样好理解吗
1100 1000 0111 1101 0100的十进制821206
0000 1000 0111 1101 0100的十进制34774
  1. #include <stdio.h>
  2. int main()
  3. {
  4.     unsigned short a=821206;
  5.     printf("%d",a); //34774
  6. }
复制代码
 楼主| 发表于 2025-8-17 10:45:54 | 显示全部楼层
本帖最后由 jiavip 于 2025-8-17 10:56 编辑

回复 5# idwma


    茅厕开了一条缝隙,,,,
换句话说:HF87D6=952278,,也就是说:摁住Alt+952278一样得“囍”,,
GBK在win系统里这样表达,有什么说法不?,,
发表于 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)
  1. Function GetGB2312AltCode(char)
  2.     ' 使用ADODB.Stream获取GB2312编码
  3.     Dim stream
  4.     Set stream = CreateObject("ADODB.Stream")
  5.     stream.Type = 2 ' Text
  6.     stream.Mode = 3 ' Read/Write
  7.     stream.Open
  8.     stream.Charset = "GB2312"
  9.     stream.WriteText char
  10.     stream.Position = 0
  11.     stream.Type = 1 ' Binary
  12.     Dim bytes
  13.     bytes = stream.Read(2) ' 读取2字节
  14.    
  15.     ' 计算GB2312编码
  16.     Dim gbCode
  17.     gbCode = AscB(MidB(bytes,1,1)) * 256 + AscB(MidB(bytes,2,1))
  18.    
  19.     ' 组合为Windows ALT编码格式
  20.     GetGB2312AltCode = "82" & Right("0000" & gbCode, 4)
  21. End Function

  22. ' 使用示例
  23. MsgBox "囍的GB2312 ALT编码是: " & GetGB2312AltCode("囍")
复制代码
从GB2312编码(821206)还原字符
  1. Function DecodeGB2312AltCode(altCode)
  2.     ' 解析ALT编码
  3.     Dim codePage, gbCode
  4.     codePage = Left(altCode, 2)
  5.     gbCode = Mid(altCode, 3)
  6.    
  7.     ' 转换为字节
  8.     Dim byte1, byte2
  9.     byte1 = CInt(gbCode \ 256)
  10.     byte2 = CInt(gbCode Mod 256)
  11.    
  12.     ' 使用ADODB.Stream转换
  13.     Dim stream
  14.     Set stream = CreateObject("ADODB.Stream")
  15.     stream.Type = 1 ' Binary
  16.     stream.Mode = 3 ' Read/Write
  17.     stream.Open
  18.     stream.Write ChrB(byte1) & ChrB(byte2)
  19.     stream.Position = 0
  20.     stream.Type = 2 ' Text
  21.     stream.Charset = "GB2312"
  22.     DecodeGB2312AltCode = stream.ReadText
  23. End Function

  24. ' 使用示例
  25. MsgBox "821206解码结果是: " & DecodeGB2312AltCode("821206")
复制代码
总结
ALT+34774:直接使用Unicode代码点,是现代系统的标准做法
ALT+0821206:使用传统的代码页编码方式,是Windows为了兼容旧系统保留的功能
这就像您比喻的"烧开水":

ALT+34774是用现代电热水壶
ALT+821206是用老式煤炉
两者都能达到相同效果,但原理不同,后者涉及更多历史兼容性考虑。
 楼主| 发表于 2025-8-17 14:18:59 | 显示全部楼层
回复 7# yakeyun


    感谢兄台,为愚兄打开茅厕!,,虽然愚兄只是想小解,,
,想不到,美国教育部长琳达·麦克马洪,口中说的 A1 (A one),那么智能,这么偏门的问题都能彻底领悟且能给出答案!,,
兄台的总结也很到位,传统问答论坛很快被A1取代,,,
还留在论坛的基本都是情怀和习惯,,
愚兄正在修炼上层内功心法,很快就可以内功烧开水了,,,,
发表于 2025-8-17 19:48:47 | 显示全部楼层
回复 7# yakeyun


AI 这个回答是错误的
Asc 返回的是 ANSI 编码,而不是 Unicode 编码
AscW 返回的才是 Unicode 编码
而且 AscW 返回的是 代理对 编码,而不是 代码点 编码
虽然双字节汉字的代理对和代码点是一样的
但四字节汉字是可以看出 AscW 返回的是 代理对,而不是 代码点
四字节字符在UTF-16文件和UTF-32文件中才保存为“代码点”
 楼主| 发表于 2025-8-17 20:14:28 | 显示全部楼层
回复 9# czjt1234


    啊?,,想不到,A1给我修炼的上层内功心法,竟然是“辟邪剑谱,葵花宝典”之类的公公招数?——欲练此功必先自宫!害老子差点切了,,,

还是老美的教育部长——琳达·麦克马洪,看出了本质,一不小心就A掉老子的1(one),,天网提起清除人类计划了么?,,
 楼主| 发表于 2025-8-17 21:14:41 | 显示全部楼层
回复 9# czjt1234
运行代码----
  1. Mshta "Vbscript:Msgbox(chr(-30762)) & Window.Close"
复制代码
得出的依旧是“囍”字,,只不过ALT + 小键盘下按 - 符号 是无效输入得出的是 ALT + 30762 = x ,所以要按 ALT + 数字 必须是正数 怎么加 +65536 都是在偏移坑位是吗 ?!
我是试出结果,,34774+65536+65536,,无论怎么叠加十六进制下去都是一个轮回,类似中文的六十甲子年鉴的轮回,,,
ALT + 100310,165846,231382,296918,362454,427990,493526 得出的都是 “囍”,,,,,
那么 !,,,意思就是说:所有的中文汉字双字节编码 都只有65536 以内的坑位是吗?,,或所有的ANSI 字符的编码只有 65536个坑位?,,,
那我要试着编写一个计算脚本,把这66536个字符收集输出到本文,背熟,,,
有些特殊字符无法被收集,例如 ALT +1 (在记事本里类似键盘操作CTRL + A全选) & ALT +10 在记事本里是  回车?,,,,,
就可以把PC 上的输入法切了?,,哈哈,,
发表于 2025-8-17 21:44:06 | 显示全部楼层
一个双字节的十六进制数可以转换为Integer类型或Long类型
比如:
    &HD6D0 = -10544           'Integer类型
    &HD6D0& = 54992           'Long类型
    CLng("&HD6D0") = 54992    'Long类型
作为GBK编码,这3个数字是等效的
  1. MsgBox &HD6D0            '-10544
  2. MsgBox &HD6D0&           '54992
  3. MsgBox CLng("&HD6D0")    '54992

  4. MsgBox Chr(-10544)    '中
  5. MsgBox Chr(&HD6D0)    '中
  6. MsgBox Chr(54992)     '中
复制代码

评分

参与人数 1技术 +1 收起 理由
jiavip + 1 VBS领域的高手

查看全部评分

发表于 2025-8-17 22:53:55 | 显示全部楼层
回复 7# yakeyun


    额 ,这ai回答 ,认真的??
 楼主| 发表于 2025-8-18 12:25:29 | 显示全部楼层
本帖最后由 jiavip 于 2025-8-18 12:28 编辑

回复 12# czjt1234


    我要写个脚本,从13(如果我没记错的话是从13开始有字符)一直循环列举到65536,然后再chr()输出到本文,,,,
我要喵一眼,看一下,Alt+小键盘,能摁出多少个奇奇怪怪我没见过的字符,,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:06 , Processed in 0.029211 second(s), 12 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表