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

[问题求助] 【已解决】JScript如何正确获取汉字的GBK编码

[复制链接]
发表于 2025-10-3 13:13:12 | 显示全部楼层 |阅读模式
本帖最后由 Cedars 于 2025-10-3 22:39 编辑

例如用JScript获取汉字“红”的byte值
  1. var stm=new ActiveXObject('Adodb.Stream');
  2. stm.Type=2;
  3. stm.Charset='gbk'
  4. stm.Open();
  5. stm.WriteText('红');
  6. stm.Position=0;
  7. stm.Type=1;
  8. var bytes=stm.Read();
  9. stm.Position=0;
  10. for(i=0;i<stm.Size;i++){
  11. WSH.echo(bytes[i].toString(16))
  12. }
  13. stm.Close()
复制代码
但报错,'bytes'为空或不是对象,我用vbs重现了该功能返回没有问题,stm.Read()返回类型确实是个数组,我查了以下是一个安全数组,我也尝试用了new VBArray,却提示缺少VBArray,麻烦大佬看看代码如何修改才能正常获取结果
发表于 2025-10-3 16:00:20 | 显示全部楼层
vbs结合js
保存为test1.wsf,编码是utf8-bom
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <package xmlns="http://schemas.microsoft.com/WindowsScriptHost">
  3.   <job id="job1">
  4.     <script language="VBScript">
  5.       <![CDATA[
  6. Function gbk(ByVal str)
  7.   On Error Resume Next
  8.   gbk = Asc(str)
  9.   If gbk < 0 Then gbk = gbk + 65536
  10. End Function
  11. ]]>
  12.     </script>
  13.      <script language="JScript">
  14.     <![CDATA[
  15.      WSH.Echo(gbk("红").toString(16));
  16.     ]]>
  17.   </script>
  18.   </job>
  19. </package>
复制代码

评分

参与人数 1技术 +1 收起 理由
Cedars + 1 感谢大佬,竟然还有这种后缀的文件,受教了

查看全部评分

发表于 2025-10-3 20:28:16 | 显示全部楼层
超过100k速度会变慢 ,越大越慢

  1. var stm=new ActiveXObject('Adodb.Stream');
  2. stm.Type=2;
  3. stm.Charset='gbk'
  4. stm.Open();
  5. stm.WriteText('红');
  6. stm.Position=0;
  7. stm.Type=1;

  8. //var bytes=stm.Read();
  9. var bytes=GetObject('new:wia.vector');
  10. bytes.binarydata=stm.read();
  11. stm.Position=0;

  12. /*
  13. for(i=0;i<stm.Size;i++){
  14. WSH.echo(bytes[i].toString(16))
  15. }
  16. */

  17. for(var i=1;i<=bytes.count;i++){
  18. WScript.echo(bytes(i).toString(16).toUpperCase());
  19. }

  20. stm.Close();
  21. stm=null;bytes=null;
复制代码

评分

参与人数 1技术 +1 收起 理由
Cedars + 1 乐于助人

查看全部评分

 楼主| 发表于 2025-10-3 20:43:33 | 显示全部楼层
回复 3# Five66


    感谢大佬,原本也没有打算用js去处理字节值,只是觉得好奇
发表于 2025-10-5 07:08:06 | 显示全部楼层
安全数组有个toArray方法可以转换成js数组

评分

参与人数 1技术 +1 收起 理由
Cedars + 1 乐于助人

查看全部评分

 楼主| 发表于 2025-10-5 10:48:05 | 显示全部楼层
回复 5# jyswjjgdwtdtj


   多谢大佬的回复, 使用toArray依然会显示bytes为空或不是对象,所以才觉得JScript处理字节数组很是奇怪,vbs一样的代码,js中就是不行,VBArray、toArray、new Aarray都试了还是不行,我在powershell中试过bytes就是数组,在C#中引用Microsoft.JScript,运行代码,依然是可以得到字节数组的,所以我才说bytes变量确实是数组,但在JScript却不能直接处理,所以才好奇的问了问各位大佬
发表于 2025-10-5 11:31:51 | 显示全部楼层
是否是系统问题?
  1. var bytes2=new VBArray(bytes).toArray();
复制代码
经测试是没问题的;
 楼主| 发表于 2025-10-5 12:06:16 | 显示全部楼层
回复 7# flashercs


    我在win7、win10系统下都试过了,加上new VBArray还是显示缺少VBArray,大佬是什么系统版本啊
发表于 2025-10-5 12:09:51 | 显示全部楼层
回复 8# Cedars


    Windows11 24H2
 楼主| 发表于 2025-10-5 12:18:50 | 显示全部楼层
回复 9# flashercs


    没想到JScript都是弃用的存在了,竟然在win11上还能有功能更新,多谢大佬解惑
发表于 2025-10-6 09:08:17 | 显示全部楼层
本帖最后由 idwma 于 2025-10-6 22:25 编辑
  1. var stm=new ActiveXObject('Adodb.Stream');
  2. stm.Type=2;
  3. stm.Charset='gbk'
  4. stm.Open();
  5. stm.WriteText('红');
  6. stm.Position=0;
  7. stm.Charset='cp819'; //stm.Type=1;
  8. var bytes=stm.ReadText();
  9. stm.Position=0;
  10. for(i=0;i<stm.Size;i++){
  11. WSH.echo(bytes.charCodeAt(i).toString(16))
  12. }
  13. stm.Close()
复制代码

评分

参与人数 1技术 +1 收起 理由
Cedars + 1 乐于助人

查看全部评分

 楼主| 发表于 2025-10-6 16:20:12 | 显示全部楼层
回复 11# idwma


    Charset='cp819'为啥是等同与Type=1
发表于 2025-10-6 18:36:55 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-10-6 18:43 编辑

回复 1# Cedars

若仅是用 jscript 代码获取中文字符的gbk编码值,可试试以下 bat+jscript 混编代码,存为 test.bat 运行

  1. 2>1/* ::
  2. @echo off &cscript /nologo /e:jscript "%~f0" &pause&exit/b */
  3. var uc10 = '红'.charCodeAt(0); // 返回值》中文字符 unicode 即 utf-16le 的 10进制编码值
  4. var uc16 = '0x'+uc10.toString(16);  // 返回值》unicode 即 utf-16le 的 16进制编码值
  5. WSH.echo(''+uc10+','+uc16);
  6. WSH.echo(String.fromCharCode(uc10,uc16)); // 还原中文字符
  7. WSH.quit();
复制代码

评分

参与人数 1技术 +1 收起 理由
Cedars + 1 乐于助人

查看全部评分

发表于 2025-10-6 19:10:41 | 显示全部楼层
回复 1# Cedars

单纯用 jscript 获取中文字符编码值,并非要取道 adodb.stream。ms当年用jscript定标早期的javascript,并没有赋予jscript直接处理二进制数据的能力,至今 jscript 也没有 byteArray (字节)数组。如非要,则可借助同门vbs处理二进制数据的功能,还算一道捷径,但须采用 *.hta 或 *.wsf 脚本过桥,可真是在这类混编代码的脚本中造码,与其两手倒腾,还不如用vbs一网打尽更省事...
发表于 2025-10-6 20:13:41 | 显示全部楼层
都是8位类型长度一样
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-16 22:02 , Processed in 0.023755 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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