Книга: Windows Script Host для Windows 2000/XP

Ввод строк в консольном режиме

Ввод строк в консольном режиме

Самый простой способ ввести строку в консольном режиме предоставляет метод WScript.StdIn.ReadLine, при использовании этого метода ввод завершается нажатием клавиши <Enter>.

Отметим, что при использовании стандартного входного потока WScript.StdIn в Windows ХР (по крайней мере в той версии, которой пользовался автор) возникает проблема, связанная с кодировкой символов кириллицы. Дело в том, что метод WScript.StdIn.ReadLine возвращает строку в DOS-кодировке, а для вывода на экран с помощью методов WScript.StdOut.WriteLine или WScript.Echo строка должна быть в Windows-кодировке (в предыдущих версиях Windows метод WScript.StdOut.WriteLine требовал строку в DOS-кодировке). Поэтому для корректного отображения символов кириллицы на экране приходится применять дополнительные функции конвертации из DOS- в Windows-кодировку. Стандартных методов или функций, предназначенных для этой цели, в языках JScript и VBScript нет, поэтому такие функции следует написать самостоятельно.

Рассмотрим сначала написанную на JScript функцию конвертации DosToWin из листинга 2.14:

function DosToWin(s) {
 var i,ss;  //Объявляем переменные
 //Проверяем, создан ли объект RusDict
 if (typeof(RusDict)=="undefined")
  //Если объект RusDict не создан, создаем его
  MakeRusDict();
 ss="";
 for (i=0;i<s.length;i++) {  //Цикл по всем символам в строке
  if (RusDict.Exists(s.charAt(i)))  //Проверяем наличие символа в словаре
   //Преобразуем i-й символ в Windows-кодировку
   ss+=RusDict.Item(s.charAt(i));
  else ss+=s.charAt(i);
 }
 return ss;
}

Как мы видим, эта функция преобразует переданную в качестве параметра строку следующим образом: все символы кириллицы в этой строке переводятся в Windows-кодировку, остальные символы остаются без изменений. Основным в функций DosToWin является использование объекта Dictionary (аналог ассоциативного массива) с именем RusDict. Этот объект формируется в функции MakeRusDict и содержит пары "ключ"–"значение" для всех букв русского алфавита, причем в качестве ключа указывается буква в DOS-кодировке, а в качестве значения — символ с кодом, который соответствует этой букве в Windows-кодировке:

function MakeRusDict() {
 //Создаем объект Dictionary
 RusDict = WScript.CreateObject("Scripting.Dictionary");
 //Заполняем пары "ключ" (символ в DOS-кодировке)-"значение" (символ в
 //Window-кодировке) для всех букв русского алфавита
 RusDict.add("Ђ", "А"); RusDict.add("Ѓ", "Б"); RusDict.add("‚", "В");
 RusDict.add("ѓ", "Г"); RusDict.add("„", "Д"); RusDict.add("…", "Е");
 RusDict.add("р", "Ё"); RusDict.add("†", "Ж"); RusDict.add("‡", "З");
 RusDict.add("€", "И"); RusDict.add("‰", "Й"); RusDict.add("Љ", "К");
 RusDict.add("‹", "Л"); RusDict.add("Њ", "М"); RusDict.add("Ќ", "Н");
 RusDict.add("Ћ", "О"); RusDict.add("Џ", "П"); RusDict.add("ђ", "Р");
 RusDict.add("‘", "С"); RusDict.add("’", "Т"); RusDict.add("“", "У");
 RusDict.add("”", "Ф"); RusDict.add("•", "Х"); RusDict.add("–", "Ц");
 RusDict.add("—", "Ч"); RusDict.add("?", "Ш"); RusDict.add("™", "Щ");
 RusDict.add("љ", "Ъ"); RusDict.add("›", "Ы"); RusDict.add("њ", "Ь");
 RusDict.add("ќ", "Э"); RusDict.add("ћ", "Ю"); RusDict.add("џ", "Я");
 RusDict.add(" ", "а"); RusDict.add("Ў", "б"); RusDict.add("ў", "в");
 RusDict.add("Ј", "г"); RusDict.add("¤", "д"); RusDict.add("Ґ", "е");
 RusDict.add("с", "ё"); RusDict.add("¦", "ж"); RusDict.add("§", "з");
 RusDict.add("Ё", "и"); RusDict.add("©", "й"); RusDict.add("Є", "к");
 RusDict.add("«", "л"); RusDict.add("¬", "м"); RusDict.add("­", "н");
 RusDict.add("®", "о"); RusDict.add("Ї", "п"); RusDict.add("а", "р");
 RusDict.add("б", "с"); RusDict.add("в", "т"); RusDict.add("г", "у");
 RusDict.add("д", "ф"); RusDict.add("е", "х"); RusDict.add("ж", "ц");
 RusDict.add("з", "ч"); RusDict.add("и", "ш"); RusDict.add("й", "щ");
 RusDict.add("к", "ъ"); RusDict.add("л", "ы"); RusDict.add("м", "ь");
 RusDict.add("н", "э"); RusDict.add("о", "ю"); RusDict.add("п", "я");
}

В функции DosToWin из VBScript-сценария StdIn1.vbs (листинг 2.15) реализован другой подход к переводу строки в Windows-кодировку, связанный с преобразованием ANSI-кодов символов:

Function DosToWin(s)
Dim i,k,ss
 ss=""
 For i=1 To Len(s)  ' Цикл по всем символам в строке
  k = Asc(Mid(s,i,1))  ' Определяем ANSI-код i-го символа
  ' Изменяем код k на код соответствующего символа в
  ' Windows-кодировке
  If (128 <= k) And (k <= 175) Then
   k=k+64
  ElseIf (224 <= k) And (k <= 239) Then
   k=k+16
  ElseIf k = 240 Then
   k=168
  ElseIf k = 241 Then
   k=184
  End If
  ss=ss+Chr(k)  ' Возвращаем преобразованную строку
 Next
 DosToWin=ss
End Function

Весь алгоритм этой функции состоит в вычислении по ANSI-коду буквы русского алфавита в DOS-кодировке кода символа в Windows-кодировке, соответствующего этой букве.

Листинг 2.14. Ввод одной строки с помощью метода StdIn.ReadLine (JScript)

/*******************************************************************/
/* Имя: StdIn1.js                                                  */
/* Язык: JScript                                                   */
/* Описание: Пример использования метода StdIn.ReadLine            */
/*******************************************************************/
var s,RusDict;  //Объявляем переменные
//Функция для создания объекта Dictionary с парами "ключ-значение", где
//"ключ"-буква в DOS-кодировке, "значение"- символ, соответствующий этой
//букве в Windows-кодировке
function MakeRusDict() {
  //Создаем объект Dictionary
 RusDict = WScript.CreateObject("Scripting.Dictionary");
 //Заполняем пары "ключ" (символ в DOS-кодировке)-"значение" (символ в
 //Window-кодировке) для всех букв русского алфавита
 RusDict.add("Ђ", "А"); RusDict.add("Ѓ", "Б"); RusDict.add("‚", "В");
 RusDict.add("ѓ", "Г"); RusDict.add("„", "Д"); RusDict.add("…", "Е");
 RusDict.add("р", "Ё"); RusDict.add("†", "Ж"); RusDict.add("‡", "З");
 RusDict.add("€", "И"); RusDict.add("‰", "Й"); RusDict.add("Љ", "К");
 RusDict.add("‹", "Л"); RusDict.add("Њ", "М"); RusDict.add("Ќ", "Н");
 RusDict.add("Ћ", "О"); RusDict.add("Џ", "П"); RusDict.add("ђ", "Р");
 RusDict.add("‘", "С"); RusDict.add("’", "Т"); RusDict.add("“", "У");
 RusDict.add("”", "Ф"); RusDict.add("•", "Х"); RusDict.add("–", "Ц");
 RusDict.add("—", "Ч"); RusDict.add("?", "Ш"); RusDict.add("™", "Щ");
 RusDict.add("љ", "Ъ"); RusDict.add("›", "Ы"); RusDict.add("њ", "Ь");
 RusDict.add("ќ", "Э"); RusDict.add("ћ", "Ю"); RusDict.add("џ", "Я");
 RusDict.add(" ", "а"); RusDict.add("Ў", "б"); RusDict.add("ў", "в");
 RusDict.add("Ј", "г"); RusDict.add("¤", "д"); RusDict.add("Ґ", "е");
 RusDict.add("с", "ё"); RusDict.add("¦", "ж"); RusDict.add("§", "з");
 RusDict.add("Ё", "и"); RusDict.add("©", "й"); RusDict.add("Є", "к");
 RusDict.add("«", "л"); RusDict.add("¬", "м"); RusDict.add("­", "н");
 RusDict.add("®", "о"); RusDict.add("Ї", "п"); RusDict.add("а", "р");
 RusDict.add("б", "с"); RusDict.add("в", "т"); RusDict.add("г", "у");
 RusDict.add("д", "ф"); RusDict.add("е", "х"); RusDict.add("ж", "ц");
 RusDict.add("з", "ч"); RusDict.add("и", "ш"); RusDict.add("й", "щ");
 RusDict.add("к", "ъ"); RusDict.add("л", "ы"); RusDict.add("м", "ь");
 RusDict.add("н", "э"); RusDict.add("о", "ю"); RusDict.add("п", "я");
}
//Функция для перевода строки из DOS- в Windows-кодировку
function DosToWin(s) {
 var i,ss;  //Объявляем переменные
 //Проверяем, создан ли объект RusDict
 if (typeof(RusDict)=="undefined")
  //Если объект RusDict не создан, создаем его
  MakeRusDict();
 ss="";
 for (i=0;i<s.length;i++) {  //Цикл по всем символам в строке
  if (RusDict.Exists(s.charAt(i)))  //Проверяем наличие символа в словаре
   //Преобразуем i-й символ в Windows-кодировку
   ss+=RusDict.Item(s.charAt(i));
  else ss+=s.charAt(i);
 }
 return ss;
}
/*************  Начало *********************************************/
//Печатаем приглашение для ввода
WScript.StdOut.Write("Введите одну строку: ");
s = WScript.StdIn.ReadLine();  //Вводим строку с клавиатуры
WScript.StdOut.WriteBlankLines(1);  //Печатаем пустую строку
WScript.StdOut.Write("Было введено: ");
//Преобразовываем введенную строку в Windows-кодировку
//и выводим ее на экран
WScript.StdOut.WriteLine(DosToWin(s));
/*************  Конец *********************************************/

Листинг 2.15. Ввод одной строки с помощью метода StdIn ReadLine (VBScript)

'*******************************************************************
' Имя: StdIn1.vbs
' Язык: VBScript
' Описание: Пример использования метода StdIn.WriteLine
'*******************************************************************
' Функция для перевода строки из DOS- в Windows-кодировку
Function DosToWin(s)
Dim i,k,ss
 ss=""
 For i=1 To Len(s)  ' Цикл по всем символам в строке
  k = Asc(Mid(s,i,1))  ' Определяем ANSI-код i-го символа
  ' Изменяем код k на код соответствующего символа в
  ' Windows-кодировке
  If (128 <= k) And (k <= 175) Then
   k=k+64
  ElseIf (224 <= k) And (k <= 239) Then
   k=k+16
  ElseIf k = 240 Then
   k=168
  ElseIf k = 241 Then
   k=184
  End If
  ss=ss+Chr(k)  ' Возвращаем преобразованную строку
 Next
 DosToWin=ss
End Function
'*************  Начало *********************************************
Dim s
' Печатаем приглашение для ввода
WScript.StdOut.Write "Введите одну строку: "
s = WScript.StdIn.ReadLine  ' Вводим строку с клавиатуры
WScript.StdOut.WriteBlankLines 1   ' Печатаем пустую строку
WScript.StdOut.Write "Было введено: "
' Преобразовываем введенную строку в Windows-кодировку
' и выводим ее на экран
WScript.StdOut.WriteLine DosToWin(s)
'*************  Конец *********************************************

Используя метод WScript.StdIn.ReadAll, можно ввести сразу несколько строк подряд, ввод при этом прекращается после нажатия клавиш <Ctrl>+<Z>. Из введенной таким образом переменной можно затем сформировать массив, содержащий все строки. Для этого в JScript применяется метод split объекта string, а в VBScript — одноименная внутренняя функция Split (листинги 2.16 и 2.17). 

Листинг 2.16. Ввод нескольких строк с помощью метода StdIn.ReadAll (JScript)

/*******************************************************************/
/* Имя: StdIn2.js                                                  */
/* Язык: JScript                                                   */
/* Описание: Пример использования метода StdIn.ReadAll             */
/*******************************************************************/
var RusDict;
//Функция для создания объекта Dictionary с парами "ключ-значение", где
//"ключ"-буква в DOS-кодировке, "значение"- символ, соответствующий этой
//букве в Windows-кодировке
function MakeRusDict() {
 //Создаем объект Dictionary
 RusDict = WScript.CreateObject("Scripting.Dictionary");
 //Заполняем пары "ключ" (символ в DOS-кодировке)-"значение" (символ в
 //Window-кодировке) для всех букв русского алфавита
 RusDict.add("Ђ", "А"); RusDict.add("Ѓ", "Б"); RusDict.add("‚", "В");
 RusDict.add("ѓ", "Г"); RusDict.add("„", "Д"); RusDict.add("…", "Е");
 RusDict.add("р", "Ё"); RusDict.add("†", "Ж"); RusDict.add("‡", "З");
 RusDict.add("€", "И"); RusDict.add("‰", "Й"); RusDict.add("Љ", "К");
 RusDict.add("‹", "Л"); RusDict.add("Њ", "М"); RusDict.add("Ќ", "Н");
 RusDict.add("Ћ", "О"); RusDict.add("Џ", "П"); RusDict.add("ђ", "Р");
 RusDict.add("‘", "С"); RusDict.add("’", "Т"); RusDict.add("“", "У");
 RusDict.add("”", "Ф"); RusDict.add("•", "Х"); RusDict.add("–", "Ц");
 RusDict.add("—", "Ч"); RusDict.add("?", "Ш"); RusDict.add("™", "Щ");
 RusDict.add("љ", "Ъ"); RusDict.add("›", "Ы"); RusDict.add("њ", "Ь");
 RusDict.add("ќ", "Э"); RusDict.add("ћ", "Ю"); RusDict.add("џ", "Я");
 RusDict.add(" ", "а"); RusDict.add("Ў", "б"); RusDict.add("ў", "в");
 RusDict.add("Ј", "г"); RusDict.add("¤", "д"); RusDict.add("Ґ", "е");
 RusDict.add("с", "ё"); RusDict.add("¦", "ж"); RusDict.add("§", "з");
 RusDict.add("Ё", "и"); RusDict.add("©", "й"); RusDict.add("Є", "к");
 RusDict.add("«", "л"); RusDict.add("¬", "м"); RusDict.add("­", "н");
 RusDict.add("®", "о"); RusDict.add("Ї", "п"); RusDict.add("а", "р");
 RusDict.add("б", "с"); RusDict.add("в", "т"); RusDict.add("г", "у");
 RusDict.add("д", "ф"); RusDict.add("е", "х"); RusDict.add("ж", "ц");
 RusDict.add("з", "ч"); RusDict.add("и", "ш"); RusDict.add("й", "щ");
 RusDict.add("к", "ъ"); RusDict.add("л", "ы"); RusDict.add("м", "ь");
 RusDict.add("н", "э"); RusDict.add("о", "ю"); RusDict.add("п", "я");
}
//Функция для перевода строки из DOS- в Windows-кодировку
function DosToWin(s) {
 var i,ss;  //Объявляем переменные
 //Проверяем, создан ли объект RusDict
 if (typeof(RusDict)=="undefined")
  //Если объект RusDict не создан, создаем его
  MakeRusDict();
 ss="";
 for (i=0;i<s.length;i++) {  //Цикл по всем символам в строке
  if (RusDict.Exists(s.charAt(i)))  //Проверяем наличие символа в словаре
   //Преобразуем i-й символ в Windows-кодировку
   ss+=RusDict.Item(s.charAt(i));
  else ss+=s.charAt(i);
 }
 return ss;
}
/*************  Начало *********************************************/
var s,ArrS,i;  //Объявляем переменные
//Печатаем приглашение для ввода
WScript.StdOut.WriteLine("Вводите строки:");
s = WScript.StdIn.ReadAll();  //Вводим строки с клавиатуры
WScript.StdOut.WriteBlankLines(3);  //Печатаем пустые строки
ArrS=s.split("n");  //Формируем массив из введенных строк
WScript.StdOut.WriteLine("Всего ведено строк: "+ArrS.length);
for (i=1;i<=ArrS.length;i++)
 //Преобразовываем введенные строки в Windows-кодировку
 //и выводим их на экран
 WScript.StdOut.WriteLine(i+": "+DosToWin(ArrS[i-1]));
/*************  Конец *********************************************/

Листинг 2.17. Ввод нескольких строк с помощью метода StdIn.ReadAll (VBScript)

'*******************************************************************
' Имя: StdIn2.vbs
' Язык: VBScript
' Описание: Пример использования метода StdIn.ReadAll
'*******************************************************************
Option Explicit
' Функция для перевода строки из DOS- в Windows-кодировку
Function DosToWin(s)
Dim i,k,ss
 ss=""
 For i=1 To Len(s)  ' Цикл по всем символам в строке
  k = Asc(Mid(s,i,1))  ' Определяем ANSI-код i-го символа
  ' Изменяем код k на код соответствующего символа в
  ' Windows-кодировке
  If (128 <= k) And (k <= 175) Then
   k=k+64
  ElseIf (224 <= k) And (k <= 239) Then
   k=k+16
  ElseIf k = 240 Then
   k=168
  ElseIf k = 241 Then
   k=184
  End If
  ss=ss+Chr(k)
 Next
 DosToWin=ss   ' Возвращаем преобразованную строку
End Function
'*************  Начало *********************************************
Dim s,ArrS,i,ColStr   ' Объявляем переменные
' Печатаем приглашение для ввода
WScript.StdOut.WriteLine "Вводите строки:"
s = WScript.StdIn.ReadAll  ' Вводим строки с клавиатуры
WScript.StdOut.WriteBlankLines 3  ' Печатаем пустые строки
ArrS=Split(s,vbCrLf)  ' Формируем массив из введенных строк
ColStr=UBound(ArrS)+1
' Печатаем введенные строки
WScript.StdOut.WriteLine "Всего ведено строк: " & ColStr
For i=1 To ColStr
 ' Преобразовываем введенные строки в Windows-кодировку
 ' и выводим их на экран
 WScript.StdOut.WriteLine i & ": " & DosToWin(ArrS(i-1))
Next
'*************  Конец *********************************************/
 

Оглавление книги


Генерация: 1.130. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз