为什么WScript.StdOut.Write方法在VBS与JScript中的行为不同?

时间:2013-01-16 00:24:26

标签: vbscript jscript wsh windows-scripting

我在VBS和JScript中有两个小程序:

VBScript.vbs:

For i=0 To 255
   WScript.StdOut.Write Chr(i)
Next

JScript.js:

for ( var i=0; i <= 255; ++i )
   WScript.StdOut.Write(String.fromCharCode(i));

当我在命令提示符中执行它们时,它们会显示不同的结果:

C:>cscript /nologo VBScript.vbs
 ☺☻♥♦♣
♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]
^_`abcdefghijklmnopqrstuvwxyz{|}~⌂??'ƒ".┼╬^%S<O?Z??''""--~Ts>o?zY ¡¢£¤¥¦§¨©ª«¬­®
¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþ
ÿ

C:>cscript /nologo JScript.js
 ☺☻♥♦♣
♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]
^_`abcdefghijklmnopqrstuvwxyz{|}~⌂???????????????????????????????? ¡¢£¤¥¦§¨©ª«¬­
®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüý
þÿ

可能会解释之前的输出,因为JScript的fromCharCode方法与VBScript的Chr函数有一定的操作差异。但是,如果尝试将输出重定向到磁盘文件,结果会有很大不同:

C:>cscript /nologo VBScript.vbs > VBScript.txt

C:>cscript /nologo JScript.js > JScript.txt
C:\JScript.js(2, 4) Microsoft JScript runtime error: Invalid procedure call or argument

C:>dir *.txt

15/01/2013  05:48 p.m.               128 JScript.txt
15/01/2013  05:48 p.m.               256 VBScript.txt

在这种情况下,两个程序在相同的条件下使用相同的 WSH方法,所以我不明白为什么VBS正确生成256个字符的文件,但是JScript发出错误,只生成前128个字符。

这里发生了什么?有没有办法在JScript中正确生成具有256个不同字符的相同文件? TIA

安东尼奥

2 个答案:

答案 0 :(得分:6)

第一,

你的代码逻辑不一样。

VBScript.vbs 的计数从ZERO(0)开始,而 JScript.js ONE(1)开始。

更改JScript中的增量运算符以使它们相同:

for ( var i=0; i <= 255; i++ )
    WScript.StdOut.Write(String.fromCharCode(i));

第二

您使用的功能不尽相同 因为他们都返回不同的结果 在每个角色的背景下。

Chr()函数返回ASCII字符,

fromCharCode()函数返回每个字符可能包含1到4个字节的Unicode字符。

因此,ASCII集中的Å字符与Unicode集中的Å字符不同。

答案 1 :(得分:0)

关于@OpenTechnologist所说的,你如何在VBScript中使用ChrW()而不是Chr(),因为这将更接近fromCharCode()的本质,即输出Unicode。