1 (изменено: yuriy2000, 2014-09-01 05:27:41)

Тема: VBS: Определение кодировки (1251 или 866)

Приветствую!

Ранее на форуме была тема про автоопределение кодировки UTF-8 или 1251
http://forum.script-coding.com/viewtopic.php?id=6801

Мне же нужно было определять 1251 или 866.
Вот написал такой вариант, может быть еще кому сгодится:

Function Guess_CP(byVal sStr)
   Dim sVowel : sVowel = "[аеоиуяы]" 'гласные (часто встречающиеся)
   Dim sNotVowel : sNotVowel = "[нтсрвлкмдпзбьчгй]{1,2}" 'согласные (часто встречающиеся)
   With New RegExp 
      .Global = True              
      .Pattern = "[\s]+"            
       sStr = .Replace(sStr, " ")   ' Убрать переносы строк и двойные пробелы

      .Global = False 
      .IgnoreCase = True 
      .Pattern =  sNotVowel & sVowel & sNotVowel & sVowel  

      if .Test (sStr)  then 
          Guess_CP = "W"  '1251
      elseif .Test (dos2win(sStr))  then 
          Guess_CP = "D" ' 866
      else
          Guess_CP = "X" ' Не понятно
      end if

   end With

End Function

Логика простая пытаемся найти чередование популярных кириллических гласных и согласных через RegExp
Для "нормальных" текстов дает малый процент брака.

2

Re: VBS: Определение кодировки (1251 или 866)

Благодарю!

3

Re: VBS: Определение кодировки (1251 или 866)

// функция перекодировки
var Recode={
    dos:"Ђ ЃЎ‚ўѓЈ„¤…Ґрс†¦‡§€Ё‰©ЉЄ‹«Њ¬ЌЋ®ЏЇђа‘б’в“г”д•е–ж—з˜и™йњм›лљкќнћоџпфхтуцчьшщ",
    win:"АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЬьЫыЪъЭэЮюЯяЇїЄєІі№°•",
    dos2win:function(s){var out="";for(var i=0;i<s.length;i++){var ch=s.charAt(i);var n=this.dos.indexOf(ch);if(n>=0){ch=this.win.charAt(n)};out+=ch;};return out;},
    win2dos:function(s){var out="";for(var i=0;i<s.length;i++){var ch=s.charAt(i);var n=this.win.indexOf(ch);if(n>=0){ch=this.dos.charAt(n)};out+=ch;};return out;}
}

// функция автоматического определения кодировки текста - WIN или DOS
function DetectCodePage(Text){
    var Text=Text||'';var tmpTextWin='';var tmpTextDos='';
    // регулярные выражения для наборов символов WIN и DOS кодировок
    var RegExpToWin=new RegExp('['+Recode.win+']+','g');var RegExpToDos=new RegExp('['+Recode.dos+']+','g');
    // находим и удаляем символы соответствующие разным кодировкам
    tmpTextWin=Text.replace(RegExpToWin,'');tmpTextDos=Text.replace(RegExpToDos,'');
    // определяем для какой кодировки было найдено больше символов
    if(tmpTextWin.length<tmpTextDos.length){
        //WScript.Echo("WIN");
        return "win";
    }
    else{
    //WScript.Echo("DOS");
    return "dos";
    }
}