Почему метод WScript.StdOut.Write ведет себя по-разному в VBS и JScript?

У меня есть две небольшие программы на 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{|}~⌂???????????????????????????????? ¡¢£¤¥¦§¨©ª«¬­
®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüý
þÿ

Предыдущий вывод может быть объяснен тем, что существует некоторая оперативная разница между методом fromCharCode JScript и функцией Chr в VBScript. Однако, если попытаться перенаправить вывод в файл на диске, результат будет совсем другим:

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 выдает ошибку error и просто сгенерируйте первые 128 символов.

Что здесь происходит? Есть ли способ правильно сгенерировать тот же файл с 256 разными символами в JScript? ТИА

Антонио


person Aacini    schedule 16.01.2013    source источник
comment
Интересно, а затем перенаправить в файл, как vbs/js печатают 128 байт, и здесь происходит сбой с той же ошибкой. +1 за этот вопрос.   -  person seeker    schedule 13.04.2013


Ответы (2)


первый,

логика ваших кодов не та.

подсчет вашего 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() возвращает символы Unicode, которые могут иметь от 1 до 4 байтов на символ.

поэтому символ Å из набора ASCII отличается от символа Å из набора Unicode.

person Open Technologist    schedule 07.02.2013

Что касается того, что сказал @OpenTechnologist, как насчет того, чтобы вы использовали ChrW() вместо Chr() в VBScript, поскольку это приблизит к сути fromCharCode(), то есть к выводу Unicode.

person bugmagnet    schedule 13.04.2013
comment
Я вижу вашу точку зрения. Однако меня интересует противоположный вопрос, а именно: как непосредственно генерировать символы Ascii в JScript? Я решил эту проблему, уже настроив сгенерированные коды с коэффициентом, который является переменным для каждого символа за пределами 127... - person Aacini; 13.04.2013