/CYRILLIC/recode.txt

/* # Схема перекодировок без потери информации
#
# Версия 0.9999b (с) С.В.Знаменский, 1996
# грант РФФИ 96-07-89406
#
# Оригинал этого файла должен лежать на ftp.tex.math.ru
*/
#include
#include
#include
#include

#ifndef unix
#include
#endif

char debug=3;
/************************************************************************
* Если исследуемый файл большой, то вероятно не стоит читать его до конца
* чтобы выяснить кодировку. Опция командной строки дожна позволить изменить
* следующее заданное по умолчанию количество максимально считываемых символов.
*/
unsigned int total_count, /* number od chars already readen
*/
max_total_count=32000; /* number of chars to read from a
* file must not be moreЪthen
* max_total_count
*/
/* В течение прохода файла считываемый символ должен сравниваться с
* сохраненным предыдущим и определяться, для каких кодировок такая пара
* типична, а для каких исключительно необычна
*/
char newchar, /* The char is readen just now
*/
lastchar, /* The char has been readen just before
*/
/* Их признаки будут считаться для каждой кодировки
*/
lastcap[16], /* Is the char readen before
* a capital letter in some codings?
*/
newcap, /* is a new charchar
* a capital letter?
*/
lastletter[16], newletter; /* and which a letter?
*/
unsigned char code_num; /* current coding table number */
unsigned char final_code_num; /* The result: The best appropriate
* coding table number */

unsigned char num_of_cod=0; /* total number of coding tables */
int cyr_count[16]; /* number of cyrillic text (non-)specific
* biletter substrings readen for a code_num
*/
char codenames[16][40]; /* names of code tables */

/* Следующие строки (по одной на кодировку, всего num_of_cod) и их общее
* количество предполагается определять из файла RECODE.BAS.
*/

char TO_INTERNAL[16][256]; /* 16 strings of length 256 such,
* that internal_code_of_current_char
* =TO_INTERNAL[code_num][char_num];
*/
FILE *tst;
int pos;


/* Признак TO_CAPITAL
(заглавные кириллические буквы =5, похожие на них с кодами < 128 =1
строчные =6, похожие на них с кодами < 128 =2
безразличные =7, прочие с кодами < 128 =3) */
/*
TO_CAPITAL code:

| Char code < 128 | Char code > 128
-----------------------+-----------------+-------------------
Capital like cyrillic | 1 | 5
Small like cyrillic | 2 | 6
Other | 3 | 7
*/
char TO_CAPITAL [256]={
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1,
/* for some Caucasian languages "I" is not alwys capital */
1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 3, 3, 3, 3,
/* for some cyrillic languages probably "Y" may be used for a small letter */
3, 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2,
/* for some cyrillic languages prefix "a" usually appears before capitalized */
/* word, for others "h" probably may be used as capital */
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6};

/* Признак TO_LETTER:
1-32 - буква русского алфавита А-Я и схожие по очертаниям,
33-47 - \"e и другие буквы из ISO 8859-5 а также латинские буквы, схожие с ними по очертаниям,
45 - прочие латинские буквы, встречающиеся в словах кириллических языков
48 - остальные латинские буквы, не встречающиеся в словах кириллических языков
49 - пробел и знаки препинания,
50 - редко примыкающие к словам но часто встречающиеся в текстах
знаки кодов менее 128,
51 - редкие в текстах символы кодов менее 128,
52 - прочие кириллические и управляющие символы (не документированы)
*/

/* TO_LETTER code:

Chars | Codes
-------------------------+----------------------
Russian letters A-YA | 1 - 32
and similar latin letters|
-------------------------+----------------------
\"E and other cyrillic | 33 - 44,46,47
letters ISO 8859-5 |
and similar latin letters|
-------------------------+----------------------
Latin letters usual | 45
for some cyrillic |
languages |
-------------------------+----------------------
The other latin letters | 48
-------------------------+----------------------
The space and another | 49
word delimiters |
-------------------------+----------------------
Digits and symbols not | 50
adjacent to words |
-------------------------+----------------------
Unusual for text chars | 51
with codes < 128 |
-------------------------+----------------------
Non-documented cyrillic | 52
and control chars |
*/

unsigned char TO_LETTER[256]={
51, 51, 51, 51, 51, 51, 51, 51, 49, 51, 49, 51, 49, 49, 51, 51,
51, 51, 51, 51, 51, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
49, 49, 49, 50, 50, 50, 50, 49, 49, 49, 50, 50, 49, 49, 49, 50,
50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 49, 49, 49, 50, 49, 49,
50, 1, 3, 18, 48, 6, 45, 48, 14, 38, 48, 11, 48, 13, 48, 15,
/* A B C D E F G H I J K L M N O
P Q R S T U V W X Y Z */
17, 45, 48, 37, 19, 48, 48, 45, 22, 45, 48, 49, 49, 49, 49, 49,
49, 1, 48, 18, 48, 6, 48, 48, 45, 38, 48, 45, 48, 19, 16, 15,
/*' a b c d e f g h i g k l m n o
p q r s t u v w x y z */
17, 45, 48, 37, 48, 9, 48, 45, 22, 20, 48, 49, 49, 49, 49, 49,
52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
49, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 49, 46, 47,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
49, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 49, 46, 47
};

/* The same does not work:
unsigned char TO_LETTER[]=
"\063\063\063\063\063\063\063\063\061\063\061\063\061\061\063\063\
\063\063\063\063\063\062\063\063\063\063\063\063\063\063\063\063\
\061\061\061\062\062\062\062\061\061\061\062\062\061\061\061\062\
\062\062\062\062\062\062\062\062\062\062\061\061\061\062\061\061\
\062\001\003\022\060\006\055\060\016\046\060\013\060\015\060\017\
\021\055\060\045\023\060\060\055\026\055\060\061\061\061\061\061\
\061\001\060\022\060\006\060\060\055\046\060\055\060\023\020\017\
\021\055\060\045\060\011\060\055\026\024\060\061\061\061\061\061\
\064\064\064\064\064\064\064\064\064\064\064\064\064\064\064\064\
\064\064\064\064\064\064\064\064\064\064\064\064\064\064\064\064\
\061\041\042\043\044\045\046\047\050\051\052\053\054\061\056\057\
\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\
\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\
\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\
\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\
\061\041\042\043\044\045\046\047\050\051\052\053\054\061\056\057";
*/
char *frequently_next[53] =
{ "",
/* А -> .АБВГДЖЗЙКЛМНПРСТХЧШЯ */
"\001\002\003\004\005\007\010\012\013\014\015\016\020\021\022\023\026\030\031\040\061",
/* Б -> АЕИОУЫ */ "\001\006\011\017\024\034",
/* В -> .АЕИНОРУЫ */ "\001\006\011\016\017\021\024\034\061",
/* Г -> .АЕИОРУЫ */ "\001\006\011\017\021\024\034\061",
/* Д -> .АЕИНОУЫ */ "\001\006\011\016\017\024\034\061",
/* Е -> .БВГДЗЙКЛМНПРСТХШ */
"\002\003\004\005\010\012\013\014\015\016\020\021\022\023\026\031\061",
/* Ж -> АИ */ "\001\011",
/* З -> .АДЕИНУЫ */ "\001\005\006\011\016\024\034\061",
/* И -> .ВГДЗЙКЛМНРСТЧШЯ */
"\003\004\005\010\012\013\014\015\016\021\022\023\030\031\040\061",
/* Й -> .ДИЛНТЫ */ "\005\011\014\016\023\034\061",
/* К -> .АЕИКЛОСТУЫ */ ",1\006\011\013\014\017\022\023\024\034\061",
/* Л -> .АГДЕИЛМНОТУХЫЬЭЯ */
"\001\004\005\006\011\014\015\016\017\023\024\026\034\035\036\040\061",
/* М -> .АЕИОУЫ */ "\001\006\011\017\024\034\061",
/* Н -> .АГДЕИМНОСТУЧЫЬЭЯ */
"\001\004\005\006\011\015\016\017\022\023\024\030\034\035\036\040\061",
/* О -> .БВГДЗЙКЛМНПРСТХШ */
"\002\003\004\005\010\012\013\014\015\016\020\021\022\023\026\031\061",
/* П -> .АЕИОТУЫ */ "\001\006\011\017\023\024\034\061",
/* Р -> .АГДЕИКЛМНОСТУЫ */
"\001\004\005\006\011\013\014\015\016\017\022\023\024\034\061",
/* С -> .АЕИКЛНОСТУЫЬЯ */
"\001\006\011\013\014\016\017\022\023\024\034\035\040\061",
/* Т -> .АВЕИКЛНОТУЫЬЭ */
"\001\003\006\011\013\014\016\017\023\024\034\035\036\061",
/* У -> .ВГДЗЙКЛМНПРСТХЧШ */
"\003\004\005\010\012\013\014\015\016\020\021\022\023\026\030\031\061",
/* Ф */ "",
/* Х -> .АИОТУ */ "\001\011\017\023\024\061",
/* Ц -> АИ */ "\001\011",
/* Ч -> АЕИУЫ */ "\001\006\011\024\034",
/* Ш -> .АЕИКЛТЫ */ "\001\006\011\013\014\023\034\061",
/* Щ */ "",
/* Ъ */ "",
/* Ы -> .ГДКЛМНПРСТШ */
"\004\005\013\014\015\016\020\021\022\023\031\061",
/* Ь -> . */ "\061",
/* Э -> ДКЛМНТ */ "\005\013\014\015\016\023",
/* Ю */ "",
/* Я -> .ВНС */ "\003\016\022\061",
/* п */ "",
/* У */ "",
/* Ж */ "",
/* с */ "",
/* I */ "",
/* S */ "",
/* у */ "",
/* J */ "",
/* С */ "",
/* */ "",
/* */ "",
/* з */ "",
/* W */ "",
/* в */ "",
/* Ф */ "",
/* z */ "",
/* . -> АБВГДЕЗИЙКЛМНОПРСТУХЧШЭЯ */
"\001\002\003\004\005\006\010\011\012\013\014\015\016\017\020\021\022\023\024\026\030\031\036\040",
/* 1 */ "",
/*  */ "",
/* ? */ "",
};

char *rarely_next[53] =
{ "",
/* А -> */ "",
/* Б -> JWЙФШ */ "\012\025\031\050\055",
/* В -> WБЙФув */ "\002\012\025\047\056\055",
/* Г -> JЖЗЙФЦШЩпув */
"\007\010\012\025\027\031\032\041\047\050\056",
/* Д -> JWЙФЩув */ "\012\025\032\047\050\055\056",
/* Е -> IЫЬсув */ "\034\035\044\045\047\056",
/* Ж -> IJWЗЙМПФХШЩЪЮЯпсув */
"\010\012\015\020\025\026\031\032\033\037\040\041\044\045\050\055\056\0039",
/* З -> JWЙФЦШЩпсу */ "\012\025\027\031\032\041\044\047\050\055",
/* И -> ЪЬ */ "\033\035",
/* Й -> JW ФСУЖЩЪЬЭпсувз */
"\032\033\035\036\041\042\043\044\047\050\051\052\053\054\055\056\057",
/* К -> WБЙФЩЯсув */ "\002\012\025\032\040\044\047\055\056",
/* Л -> */ "",
/* М -> JWЗЙЩЪпсу */ "\010\012\032\033\041\044\047\050\055",
/* Н -> */ "",
/* О -> WЪ */ "\033\055",
/* П -> JWВЖЗЙФЮувз */ "\003\007\010\012\025\037\047\050\054\055\056",
/* Р -> ув */ "\047\056",
/* С -> Йув */ "\012\047\056",
/* Т -> WЖЗЙЩу */ "\007\010\012\032\047\055",
/* У -> IЪпув */ "\033\041\045\047\056",
/* Ф -> JWБВГДЖЗЙКПХЦЧШЩЪЬЮЯпсув */
"\002\003\004\005\007\010\012\013\020\026\027\030\031\032\033\035\037\040\041\044\047\050\055\056",
/* Х -> SЖЙФЩЮпсу */ "\007\012\025\032\037\041\044\046\0039",
/* Ц -> JSWБЖЗНПФЦЧШЩЪсув */
"\002\007\010\016\020\025\027\030\031\032\033\044\046\047\050\055\056",
/* Ч -> JWБГДЖЗЙПФХЩЯсув */
"\002\004\005\007\010\012\020\025\026\032\040\044\047\050\055\056",
/* Ш -> WЖЗЙФЦЩЮЯпсув */
"\007\010\012\025\027\032\037\040\041\044\047\055\056",
/* Щ -> SWБВГДЖЗЙКЛМП? ФСУЖРСФХЦЧШЪсувз */
"\002\003\004\005\007\010\012\013\014\015\020\021\022\025\026\027\030\031\033\042\043\044\046\047\051\052\053\054\055\056\057\064",
/* Ъ -> IJSWЙКП? ФСУЖСФЦЧШЪЬсувз */
"\012\013\020\022\025\027\030\031\033\035\042\043\044\045\046\047\050\051\052\053\054\055\056\057\064",
/* Ы -> IJSWО ФСУЖЪЬЭпсувз */
"\017\033\035\036\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057",
/* Ь -> JS ФСУЖЪЬсувз */
"\033\035\042\043\044\046\047\050\051\052\053\054\056\057",
/* Э -> JS? ФСУЖЪЫЬЮпсувз */
"\033\034\035\037\041\042\043\044\046\047\050\051\052\053\054\056\057\064",
/* Ю -> IJSWВП ФСУЖФЪЫЭЯувз */
"\003\020\025\033\034\036\040\042\043\045\046\047\050\051\052\053\054\055\056\057",
/* Я -> IJSWИО ФСУЖУФЪЭпувз */
"\011\017\024\025\033\036\041\042\043\045\046\047\050\051\052\053\054\055\056\057",
/* п -> IJSWЕИ? ФСУЖУЩЪЫЬЭЯпсувз */
"\006\011\024\032\033\034\035\036\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\064",
/* У -> IJSWБВГДЖЗЙКЛМНП? ФСУЖРСТФХЦЧШЩЪЫЬЭЮЯпсувз */
"\002\003\004\005\007\010\012\013\014\015\016\020\021\022\023\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\064",
/* Ж -> IW?УЩЪЫЬЭЮЯпсув */
"\032\033\034\035\036\037\040\041\042\044\045\047\055\056\064",
/* с -> ? ФСУЖЪЫЬпз */
"\033\034\035\041\042\043\051\052\053\054\057\064",
/* I -> ФСУЖЪЫЬпз */
"\033\034\035\041\042\043\051\052\053\054\057",
/* S -> ЙУЩЪЫЬЭЮЯп */ "\012\032\033\034\035\036\037\040\041\042",
/* у -> ? ФСУЖЪЫЬпз */
"\033\034\035\041\042\043\051\052\053\054\057\064",
/* J -> WБЙПФЦЩЪЫЬЭЮЯпсув */
"\002\012\020\025\027\032\033\034\035\036\037\040\041\044\047\055\056",
/* С -> ?IWЩЪЫЬЭЮЯпсув */
"\032\033\034\035\036\037\040\041\044\045\047\055\056\064",
/* -> ?IWЩЪЫЬЭЮЯпсув */
"\032\033\034\035\036\037\040\041\044\045\047\055\056\064",
/* -> ?IJWБГДЖЗЙПФХЩЪЫЬЭЮЯпсув */
"\002\004\005\007\010\012\020\025\026\032\033\034\035\036\037\040\041\044\045\047\050\055\056\064",
/* з -> IW?УЩЪЫЬЭЮЯпсув */
"\032\033\034\035\036\037\040\041\042\044\045\047\055\056\064",
/* W -> JЦЪЫЮЯ ФСУЖЪЬпз */
"\027\033, 27\034\035\037\040\041\042\043\050\051\052\053\054\057",
/* в -> ? ФСУЖЪЬпз */
"\033\035\041\042\043\051\052\053\054\057\064",
/* Ф -> IJSWБВГДЖЗЙКЛМНП? ФСУЖРСТФХЦЧШЩЪЫЬЭЮЯпсувз */
"\002\003\004\005\007\010\012\013\014\015\016\020\021\022\023\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\064",
/* z -> */ "",
/* а -> ЪЬ */ "\033\035",
/* 1 -> */ "",
/*  -> IJSWБВГДЖЗЙКЛМНП? ФСУЖРСТФХЦЧШЩЪЫЬЭЮЯпсувз */
"\002\003\004\005\007\010\012\013\014\015\016\020\021\022\023\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\064",
/* ? -> S ФСУЖЪЬЮсуз */
"\033\035\037\042\043\044\046\047\051\052\053\054\057"
};
void impossible (char *);
void readconfig (char*);
int hexnum ( int);
int maxfortables ( float depends[16]);
void addchar (char *, int);
/***********************************************************************/
int hexnum (int num)
{
if ( num < 48 )
{
printf ("Bad halphbyte %d in pos %d ", num, pos);
exit(1);
}
else if ( num < 58 )
{
return (num-48);
}
else if ( num < 65 )
{
printf ("Bad halphbyte %d in pos %d ", num, pos);
exit(1);
}
else if ( num < 71 )
{
return (num - 55);
}
else
{
printf ("Bad halphbyte %d in pos %d ", num, pos);
exit(1);
}
return(0);
}
/***********************************************************************/
void addchar (char *str, int num)
{
str[strlen(str)+1]=0;
str[strlen(str)]=num;
}
/***********************************************************************/
void impossible (char *s)
{
extern int pos;
printf ("There must never be %s in pos %d ", s, pos);
exit(19);
}
/***********************************************************************/
void readconfig (char* FileName){
unsigned int m,n, charcode, nextchar;
FILE *handle;
extern int pos;
int char_num=128, code_num=0;
char status=1; /* 0 - in comment before codename
* 1 - in eol before codename
* 2 - in codename
* 3 - in comment after codename
* 4 - in eol after codename
* 5 - hex table between bytes
* 6 - hex table inside byte
* 7 - after all
*/
/* Initilise ascii part of TO_INTERNAL[][] */
for(n= 0;n<128; n++) {for(m= 0;m<16; m++)TO_INTERNAL[m][n]=n;}
for(n=128;n<256; n++) {for(m= 0;m<16; m++)TO_INTERNAL[m][n]=1;}
pos=0;
strcpy (codenames[0],"");
/* open a file for input */
if ((handle = fopen( FileName, "r"))!=NULL) {
if(debug>3){puts("\nReading code tables from the RECODE.BAS:\n");}
code_num = 0;
while ( (!feof(handle)) && (status<7) )
{nextchar=getc(handle);
if(debug>4){printf("\tnextchar=%d\n",nextchar);}
pos++;
if(debug>5){printf("[case %d]",status);}
switch(status)
{
case 0: /* in comment before codename */
if((nextchar==10)||(nextchar==13)) status=1; break;
case 1: /* in eol before codename */
if(nextchar=='#')
status=0;
else
if((nextchar!=10)&&(nextchar!=13)&&(nextchar!=8)&&(nextchar!=32))
{status=2; addchar(codenames[code_num],nextchar);}
break;
case 2: /* in codename */
if(nextchar=='#')
status=0;
else
if((nextchar==10)||(nextchar==13))
impossible(" ':' expected after codename");
else if ( nextchar==':' )
{
#ifndef unix
if ( strcmpi (codenames[code_num],"END" ) ==0 )
#else
if ( strcmp (codenames[code_num],"END" ) ==0 )
#endif
{ status=7;
break;}
if(debug>3){
printf("\n\t\tLoading %s as codetable number %d ... ",
codenames[code_num], code_num);
}
pos=0;
if ( code_num > 15 ) impossible("Too much code tables");
status=4; }else
{addchar(codenames[code_num],nextchar);}
break;
case 3: /* in comment inside codetable */
if((nextchar==10)||(nextchar==13)) status=4; break;
case 4: /* in eol inside codetable */
if(nextchar=='#')
status=3;
else
if((nextchar!=10)&&(nextchar!=13)&&(nextchar!=8)&&(nextchar!=32))
{status=6;
charcode=hexnum(nextchar);
}
break;
case 5: /* hex table between bytes */
if(nextchar=='#')
status=3;
else
if((nextchar!=10)&&(nextchar!=13)&&(nextchar!=8)&&(nextchar!=32))
{
charcode=hexnum(nextchar);
status=6;}
break;
case 6: /* hex table inside byte */
charcode=(charcode <<4)|hexnum(nextchar);
status=5;
if ( TO_INTERNAL[code_num][charcode] !=1 )
{
printf (" TO_INTERNAL[%d][%d] =%d<>%d?\n",
code_num, charcode, TO_INTERNAL[code_num][charcode], char_num );
impossible(" double charcode ");
}
TO_INTERNAL[code_num][charcode]=char_num;
char_num++;if (char_num==256)
{code_num ++;num_of_cod ++;char_num=128;
strcpy (codenames[code_num],"");status=1;}
break;
default:;/* printf("%d",status); impossible(" such status case");*/
}}
if (status==7 )
{
if(debug>1)puts ("\n\tRECODE.BAS succesfully loaded");
}
else
impossible ("error loading RECODE.BAS");
/* close the file */
fclose( handle );
}

for (code_num=0; code_num < num_of_cod; code_num++)
{
lastletter[code_num]=49;
lastcap[code_num]=3;
if(debug>5){
printf("\n\t Values of TO_INTERNAL[%d]: %s\n",code_num,codenames[code_num]);
for (n=0; n < 256; n++)
printf("%d\n",TO_INTERNAL[code_num][n]);}}
}
/***********************************************************************/
main(int argc, char *argv[]){
float reserve, tmp_counter=-1000.0;
float cyrillicity[16]={0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0};
unsigned int tmp_count, code_num=0,
total_rus[16]={0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0};
FILE *handle;
char *EndOfDirName, *relative, *absolute;
char FileName[80];
if (argc==1)
{printf("Испытатель алгоритма автоматического распознавания кириллической кодировки \n\
текстового файла (Cyrillic Encoding Recognizer). Вызов\n\n\t\tcycoreco \n\n\
Замечания, предложения, заказ исходников по адресу znamensk@ipsun.ras.ru\n\
\n(c) Знаменский Сергей Вит., 1996, РФФИ 96-07-89406.");


/* calculate the filename */
strcpy (FileName, argv[0]);
EndOfDirName = strrchr ( FileName, 92 );
if(EndOfDirName == NULL )
{strcpy(FileName,"");}
else
{EndOfDirName[1]=0;}
strcat(FileName, "RECODE.BAS");
readconfig (FileName);

cyr_count[code_num]=0;
if( (tst=fopen(argv[1],"rb")) == NULL )
{printf(" File %s not found",argv[1]);exit(10);}
else
{printf(" Loading %s ...\n",argv[1]);}
for(total_count=0;(total_count < max_total_count)&&!feof(tst); total_count++)
{
newchar=getc(tst);
if(debug>4)
{
printf("newchar= %d\n",newchar);
}
if( newchar == EOF )
{
if(debug>2)
printf("finished reading %s, %d byte",argv[1], total_count);
break;
}
/* Перебор кодировок производится для каждого нового символа
*/
for ( code_num=0; code_num < num_of_cod; code_num++)
{
/* We read the new (current) char from text and analise which coding table
* allows it to be after the last one. We shall decide if the biletter
* string
*/
tmp_count=TO_INTERNAL [code_num][newchar];
newcap = TO_CAPITAL [tmp_count ];
newletter = TO_LETTER [tmp_count];
if ( (tmp_count>175)&&(tmp_count<240) )
{ total_rus [code_num] = total_rus [code_num] +1;
}
if ( debug>4 )
printf("%s: lastletter=%d, newletter=%d , lastcap=%d, newcap=%d, \n",
codenames[code_num], lastletter[code_num], newletter, lastcap[code_num] ,newcap);
if(((lastcap[code_num]==6)||(lastcap[code_num]==2))
&&((newcap==5)||(newcap==1)))
{
/* Заглавная после маленькой плохо; Штрафуем на 1
* Capital after small is bad
* Penalty 1
*/
cyr_count[code_num]=cyr_count[code_num]-1;
if ( debug>3 )
{
printf("%s: %d-\n",codenames[code_num],newchar);
}
}
else if ((lastcap[code_num]>3)||(newcap>3)){
/* Счет изменяется лишь в случае когда хотя бы один из двух символов
* из верхней половины.
* Codes more then 127 only
*/
if ( strchr( rarely_next[newletter],lastletter[code_num] )!=NULL )
{
/* Кодировку штрафуем
* Bad substring of two letters
*/
cyr_count[code_num]=cyr_count[code_num]-1;
if ( debug>3 )
{
printf("%s: %d-\n",codenames[code_num],newchar);
}
} else {
if ( strchr( frequently_next[newletter],lastletter[code_num] )!=NULL )
{
/* Кодировку поощряем
* Good substring of two letters
*/
if ( debug>3 )
{
printf("%s: %d+\n",codenames[code_num],newchar);
}
cyr_count[code_num]=cyr_count[code_num]+1;
}
} }
/* Сохраняем найденные значения признаков
*/
lastletter[code_num]=newletter;
lastcap[code_num]=newcap;
}
}
final_code_num=0;
/* Наконец выбираем лучшую из кодировок
*/
for(code_num=0;code_num < num_of_cod; code_num++)
{
cyrillicity[code_num]=(1.00 *cyr_count[code_num])/total_rus [code_num];
if(debug>2){
printf("\n\tДля %s значение кирилличности %d / %d = %f;\n",
codenames[code_num],cyr_count[code_num],
total_rus [code_num],cyrillicity[code_num]);
}}
if(cyrillicity[code_num]>tmp_counter)
{final_code_num=code_num;tmp_counter=cyrillicity[code_num];}
}
{if(debug>1){
printf("\n\tДля %s значение кирилличности максимально: %f.\n",
codenames[final_code_num], cyrillicity[final_code_num] );
}}

reserve=-100;
for(code_num=0;code_num < num_of_cod; code_num++)
{if((cyrillicity[final_code_num]-cyrillicity[code_num]< reserve)
&&(final_code_num!=code_num))
reserve=cyrillicity[final_code_num]-cyrillicity[code_num];
}
if(cyrillicity[final_code_num]>.8 ) absolute="Русский текстовый файл";
else if(cyrillicity[final_code_num]>.6 ) absolute="Русский текстовый файл с инородными включениями";
else if(cyrillicity[final_code_num]>.4 ) absolute="Бинарный файл с многочисленными фрагментами русского текста";
else if(cyrillicity[final_code_num]>.2 ) absolute="Бинарный файл возможно с фрагментами русского текста";
else absolute="Бинарный файл";
if (reserve<0.1) relative = "может и не";
else if (reserve<0.2) relative = "возможно";
else if (reserve<0.4) relative = "скорее всего";
else relative = "";
printf("\n\t %s %s %s в кодировке %s.\n",
absolute, argv[1], relative, codenames[final_code_num]) ;
}
/*
----------------------- Начало файла файла RECODE.BAS --------------
# Схема перекодировок без потери информации (образец конфигурационного файла)
#
# Версия 0.9999b (с) С.В.Знаменский, 1996
# грант РФФИ 96-07-89406
#
# Не вижу другого кроме фиксации таблиц перекодировки
# способа избежать потерь и искажения информации при многочисленных
# автоматических перекодировках текстовых файлов в сетях.
# Файл свободно распространяется и используется КАК ЕСТЬ.
# Мотивированные замечания и предложения принимаются с благодарностью.
# Претензии не принимаются.
#
# Просьба не изменять кодовые таблицы и другую информацию файла!!!
# Правильная версия файла, с доработанными комментариями и возможно
# (хотя и крайне нежелательно) с добавленными кодировками предполагается
# быть всегда доступной по ftp.tex.math.ru.
# http:www@www-sbras.ict.nsk.su
#
# и уж заведомо по e-mail запросу автору
#
# znamensk@ipsun.ras.ru
#
# Чтобы обеспечить возможность расширения набора поддерживаемых кодировок,
# этот набор должен описываться специальным конфигурационным файлом.
# Автоматическая перекодировка должна поддерживать режим, исключающий
# необратимые преобразования файлов, поэтому таблица должна описывать
# все 128 старших позиций независимо от того, назначен какой-либо символ
# на эту позицию или нет.
# Если символ в кодовой таблице отсутствует, его код назначен произвольно,
# по возможности сохраняя соответствие при перекодировках.
# Точное соответствие всех символов невозможно, кодовые таблицы устроены так,
# что некоторые из них неизбежно не сохранятся при смене кодировки.
# Остальные символы, имеющиеся в исходной и окончательной кодировках,
# будут сохранять свое первоначальное значение при любой цепочке перекодировок.
# Конфигурационный файл должен быть таким, чтобы его перенос на другую
# машину сохранял читаемые комментарии на русском или английском языке.
# По этой причине каждой
# кодировке соответствует строка, содержащая имя кодировки, состоящее из
# латинских букв и цифр длиной не более 20 символов оканчивающихся ":"
# и 8 строк длиной по 47 байт каждая, содержащих все шестнадцатеричные
# коды всех символов от 128 до 255, разделенные пробелами, в заданном
# ISO 8859-5 порядке:
# - Третья строка включает коды п и остальных заглавных кириллических букв
# из ISO 8859-5 в заданном там порядке.
# - Четвертая и пятая строки содержат коды всех заглавных русских букв
# кроме п по алфавиту;
# - Шестая и седьмая строки содержат коды всех строчных русских букв
# кроме я по алфавиту
# - Восьмая строка содержит коды я и остальных строчных кириллических букв
# из ISO 8859-5 в заданном там порядке.
# - Первая и вторая строки описывают коды других букв и символов.
# Подробное описание порядка букв и символов приведено в конце файла.
# Строка с единственным словом END: завершает чтение файла перекодировщиком.
#
ISO8859-5:
80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
#
CP1251:
95 85 99 82 87 88 89 8B A0 9B A6 B7 98 B0 AD A4
A9 AC AE B1 B5 B6 A5 B4 96 97 91 92 93 94 84 86
AB A8 80 81 AA BD B2 AF A3 8A 8C 8E 8D BB A1 8F
C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
B9 B8 90 83 BA BE B3 BF BC 9A 9C 9E 9D A7 A2 9F
#
CP866:
C9 B0 CB DA CA CE DF B9 FF CC B1 B2 FE F8 FB FD
DC B3 C5 BF CD BA C3 B4 C2 C1 C0 D9 BC C8 BB C4
B7 F0 D5 DE F2 B8 DD F4 D4 D3 BE BD F9 D6 F6 C6
80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
FC F1 C7 B5 F3 B6 D1 F5 D2 CF D0 D8 D7 FA F7 DB
#
KOI8:
A5 90 B8 82 BB BE 8B B5 9A B1 91 92 94 9C 96 8C
BF 81 8A 83 A0 A1 86 87 88 89 84 85 AE AB A8 80
A7 B3 A2 8F 99 A6 8E 93 A9 AA AC AD 95 A4 9F AF
E1 E2 F7 E7 E4 E5 F6 FA E9 EA EB EC ED EE EF F0
F2 F3 F4 F5 E6 E8 E3 FE FB FD FF F9 F8 FC E0 F1
C1 C2 D7 C7 C4 C5 D6 DA C9 CA CB CC CD CE CF D0
D2 D3 D4 D5 C6 C8 C3 DE DB DD DF D9 D8 DC C0 D1
9D A3 B0 B2 98 B4 B6 9B B7 B9 BA BC BD 9E 97 8D
#
MacOS:
A5 C9 AA A3 AD B0 C6 B2 CA B3 D6 C4 C5 A1 C3 FF
A9 C2 A8 B1 B5 A6 A2 B6 D0 D1 D4 D5 D2 D3 D7 A0
C7 DD AB AE B8 C1 A7 BA B7 BC BE CB CD C8 D8 DA
80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE DF
DC DE AC AF B9 CF B4 BB C0 BD BF CC CE A4 D9 DB
#
CP855:
C9 B0 CB DA CA CE DF B9 FF CC B1 B2 FE DB F0 CF
DC B3 C5 BF CD BA C3 B4 C2 C1 C0 D9 BC C8 BB C4
AE 85 81 83 87 89 8B 8D 8F 91 93 95 97 AF 99 9B
A1 A3 EC AD A7 A9 EA F4 B8 BE C7 D1 D3 D5 D7 DD
E2 E4 E6 E8 AB B6 A5 FC F6 FA 9F F2 EE F8 9D E0
A0 A2 EB AC A6 A8 E9 F3 B7 BD C6 D0 D2 D4 D6 D8
E1 E3 E5 E7 AA B5 A4 FB F5 F9 9E F1 ED F7 9C DE
EF 84 80 82 86 88 8A 8C 8E 90 92 94 96 FD 98 9A
#
END:

Описание порядка следования букв с указанием кода и наименования в UNICODE:
а также используемых в кодировках символов

+ -------------------------------- номер строки
|+-------------------------------- номер колонки
|| +----------------------------- код ISO8859-5
|| | +-------------------------- код CP1251:
|| | | +----------------------- код PC866
|| | | | +-------------------- код КОИ-8
|| | | | | +----------------- код MacOS:
|| | | | | | +-------------- код PC855
|| | | | | | | +------ UNICODE
|| | | | | | | | Description
|| | | | | | | | |
The Russian letters
30 B0-C0-80-E1-80-A1- 0X0410 # CYRILLIC CAPITAL LETTER A
31 B1-C1-81-E2-81-A3- 0X0411 # CYRILLIC CAPITAL LETTER BE
32 B2-C2-82-F7-82-EC- 0X0412 # CYRILLIC CAPITAL LETTER VE
33 B3-C3-83-E7-83-AD- 0X0413 # CYRILLIC CAPITAL LETTER GHE
34 B4-C4-84-E4-84-A7- 0X0414 # CYRILLIC CAPITAL LETTER DE
35 B5-C5-85-E5-85-A9- 0X0415 # CYRILLIC CAPITAL LETTER IE
36 B6-C6-86-F6-86-EA- 0X0416 # CYRILLIC CAPITAL LETTER ZHE
37 B7-C7-87-FA-87-F4- 0X0417 # CYRILLIC CAPITAL LETTER ZE
38 B8-C8-88-E9-88-B8- 0X0418 # CYRILLIC CAPITAL LETTER I
39 B9-C9-89-EA-89-BE- 0X0419 # CYRILLIC CAPITAL LETTER SHORT I
3A BA-CA-8A-EB-8A-C7- 0X041A # CYRILLIC CAPITAL LETTER KA
3B BB-CB-8B-EC-8B-D1- 0X041B # CYRILLIC CAPITAL LETTER EL
3C BC-CC-8C-ED-8C-D3- 0X041C # CYRILLIC CAPITAL LETTER EM
3D BD-CD-8D-EE-8D-D5- 0X041D # CYRILLIC CAPITAL LETTER EN
3E BE-CE-8E-EF-8E-D7- 0X041E # CYRILLIC CAPITAL LETTER O
3F BF-CF-8F-F0-8F-DD- 0X041F # CYRILLIC CAPITAL LETTER PE
40 C0-D0-90-F2-90-E2- 0X0420 # CYRILLIC CAPITAL LETTER ER
41 C1-D1-91-F3-91-E4- 0X0421 # CYRILLIC CAPITAL LETTER ES
42 C2-D2-92-F4-92-E6- 0X0422 # CYRILLIC CAPITAL LETTER TE
43 C3-D3-93-F5-93-E8- 0X0423 # CYRILLIC CAPITAL LETTER U
44 C4-D4-94-E6-94-AB- 0X0424 # CYRILLIC CAPITAL LETTER EF
45 C5-D5-95-E8-95-B6- 0X0425 # CYRILLIC CAPITAL LETTER HA
46 C6-D6-96-E3-96-A5- 0X0426 # CYRILLIC CAPITAL LETTER TSE
47 C7-D7-97-FE-97-FC- 0X0427 # CYRILLIC CAPITAL LETTER CHE
48 C8-D8-98-FB-98-F6- 0X0428 # CYRILLIC CAPITAL LETTER SHA
49 C9-D9-99-FD-99-FA- 0X0429 # CYRILLIC CAPITAL LETTER SHCHA
4A CA-DA-9A-FF-9A-9F- 0X042A # CYRILLIC CAPITAL LETTER HARD SIGN
4B CB-DB-9B-F9-9B-F2- 0X042B # CYRILLIC CAPITAL LETTER YERU
4C CC-DC-9C-F8-9C-EE- 0X042C # CYRILLIC CAPITAL LETTER SOFT SIGN
4D CD-DD-9D-FC-9D-F8- 0X042D # CYRILLIC CAPITAL LETTER E
4E CE-DE-9E-E0-9E-9D- 0X042E # CYRILLIC CAPITAL LETTER YU
4F CF-DF-9F-F1-9F-E0- 0X042F # CYRILLIC CAPITAL LETTER YA
50 D0-E0-A0-C1-E0-A0- 0X0430 # CYRILLIC SMALL LETTER A
51 D1-E1-A1-C2-E1-A2- 0X0431 # CYRILLIC SMALL LETTER BE
52 D2-E2-A2-D7-E2-EB- 0X0432 # CYRILLIC SMALL LETTER VE
53 D3-E3-A3-C7-E3-AC- 0X0433 # CYRILLIC SMALL LETTER GHE
54 D4-E4-A4-C4-E4-A6- 0X0434 # CYRILLIC SMALL LETTER DE
55 D5-E5-A5-C5-E5-A8- 0X0435 # CYRILLIC SMALL LETTER IE
56 D6-E6-A6-D6-E6-E9- 0X0436 # CYRILLIC SMALL LETTER ZHE
57 D7-E7-A7-DA-E7-F3- 0X0437 # CYRILLIC SMALL LETTER ZE
58 D8-E8-A8-C9-E8-B7- 0X0438 # CYRILLIC SMALL LETTER I
59 D9-E9-A9-CA-E9-BD- 0X0439 # CYRILLIC SMALL LETTER SHORT I
5A DA-EA-AA-CB-EA-C6- 0X043A # CYRILLIC SMALL LETTER KA
5B DB-EB-AB-CC-EB-D0- 0X043B # CYRILLIC SMALL LETTER EL
5C DC-EC-AC-CD-EC-D2- 0X043C # CYRILLIC SMALL LETTER EM
5D DD-ED-AD-CE-ED-D4- 0X043D # CYRILLIC SMALL LETTER EN
5E DE-EE-AE-CF-EE-D6- 0X043E # CYRILLIC SMALL LETTER O
5F DF-EF-AF-D0-EF-D8- 0X043F # CYRILLIC SMALL LETTER PE
60 E0-F0-E0-D2-F0-E1- 0X0440 # CYRILLIC SMALL LETTER ER
61 E1-F1-E1-D3-F1-E3- 0X0441 # CYRILLIC SMALL LETTER ES
62 E2-F2-E2-D4-F2-E5- 0X0442 # CYRILLIC SMALL LETTER TE
63 E3-F3-E3-D5-F3-E7- 0X0443 # CYRILLIC SMALL LETTER U
64 E4-F4-E4-C6-F4-AA- 0X0444 # CYRILLIC SMALL LETTER EF
65 E5-F5-E5-C8-F5-B5- 0X0445 # CYRILLIC SMALL LETTER HA
66 E6-F6-E6-C3-F6-A4- 0X0446 # CYRILLIC SMALL LETTER TSE
67 E7-F7-E7-DE-F7-FB- 0X0447 # CYRILLIC SMALL LETTER CHE
68 E8-F8-E8-DB-F8-F5- 0X0448 # CYRILLIC SMALL LETTER SHA
69 E9-F9-E9-DD-F9-F9- 0X0449 # CYRILLIC SMALL LETTER SHCHA
6A EA-FA-EA-DF-FA-9E- 0X044A # CYRILLIC SMALL LETTER HARD SIGN
6B EB-FB-EB-D9-FB-F1- 0X044B # CYRILLIC SMALL LETTER YERU
6C EC-FC-EC-D8-FC-ED- 0X044C # CYRILLIC SMALL LETTER SOFT SIGN
6D ED-FD-ED-DC-FD-F7- 0X044D # CYRILLIC SMALL LETTER E
6E EE-FE-EE-C0-FE-9C- 0X044E # CYRILLIC SMALL LETTER YU
6F EF-FF-EF-D1-DF-DE- 0X044F # CYRILLIC SMALL LETTER YA
21 A1-A8-F0-B3-DD-85- 0X0401 # CYRILLIC CAPITAL LETTER IO
71 F1-B8-F1-A3-DE-84- 0X0451 # CYRILLIC SMALL LETTER IO

The nonRussian letters
22 ------D5-A2------- 0X2552 # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
22 A2-80-------AB-81- 0X0402 # CYRILLIC CAPITAL LETTER DJE
23 ------DE-8F------- 0X2590 # RIGHT HALF BLOCK
23 A3-81-------AE-83- 0X0403 # CYRILLIC CAPITAL LETTER GJE
25 ------B8-A6------- 0X2555 # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
25 A5-BD-------C1-89- 0X0405 # CYRILLIC CAPITAL LETTER DZE
26 ------DD-8E------- 0X258C # LEFT HALF BLOCK
26 A6-B2-------A7-8B- 0X0406 # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
27 ---------93------- 0X2320 # TOP HALF INTEGRAL
27 A7-AF-F4----BA-8D- 0X0407 # CYRILLIC CAPITAL LETTER YI
28 ------D4-A9------- 0X2558 # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
28 A8-A3-------B7-8F- 0X0408 # CYRILLIC CAPITAL LETTER JE
29 ------D3-AA------- 0X2559 # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
29 A9-8A-------BC-91- 0X0409 # CYRILLIC CAPITAL LETTER LJE
2A ------BE-AC------- 0X255B # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
2A AA-8C-------BE-93- 0X040A # CYRILLIC CAPITAL LETTER NJE
2B ------BD-AD------- 0X255C # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
2B AB-8E-------CB-95- 0X040B # CYRILLIC CAPITAL LETTER TSHE
2C ------F9-95------- 0X2219 # BULLET OPERATOR
2C AC-8D-------CD-97- 0X040C # CYRILLIC CAPITAL LETTER KJE
2F ------C6-AF------- 0X255E # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
2F AF-8F-------DA-9B- 0X040F # CYRILLIC CAPITAL LETTER DZHE
72 ------C7-B0------- 0X255F # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
72 F2-90-------AC-80- 0X0452 # CYRILLIC SMALL LETTER DJE
73 ------B5-B2------- 0X2561 # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
73 F3-83-------AF-82- 0X0453 # CYRILLIC SMALL LETTER GJE
75 ------B6-B4------- 0X2562 # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
75 F5-BE-------CF-88- 0X0455 # CYRILLIC SMALL LETTER DZE
76 ------D1-B6------- 0X2564 # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
76 F6-B3-------B4-8A- 0X0456 # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
77 ---------9B------- 0X2321 # BOTTOM HALF INTEGRAL
77 F7-BF-F5----BB-8C- 0X0457 # CYRILLIC SMALL LETTER YI
78 ------D2-B7------- 0X2565 # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
78 F8-BC-------C0-8E- 0X0458 # CYRILLIC SMALL LETTER JE
79 ------CF-B9------- 0X2567 # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
79 F9-9A-------BD-90- 0X0459 # CYRILLIC SMALL LETTER LJE
7A ------D0-BA------- 0X2568 # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
7A FA-9C-------BF-92- 0X045A # CYRILLIC SMALL LETTER NJE
7B ------D8-BC------- 0X256A # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
7B FB-9E-------CC-94- 0X045B # CYRILLIC SMALL LETTER TSHE
7C ------D7-BD------- 0X256B # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
7C FC-9D-------CE-96- 0X045C # CYRILLIC SMALL LETTER KJE
7F ------DB-8D------- 0X2588 # FULL BLOCK *)
7F FF-9F-------DB-9A- 0X045F # CYRILLIC SMALL LETTER DZHE
16 ------C3-86----C3- 0X251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
16 ---A5-------A2---- 0X0490 # CYRILLIC CAPITAL LETTER GHE WITH UPTURN
17 ------B4-87----B4- 0X2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT
17 ---B4-------B6---- 0X0491 # CYRILLIC SMALL LETTER GHE WITH UPTURN

The symbols looks more or less like left/right coma quotation.
1A ------C0-84----C0- 0X2514 # BOX DRAWINGS LIGHT UP AND RIGHT
1A ---91-------D4---- 0X2018 # LEFT SINGLE QUOTATION MARK
1B ------D9-85----D9- 0X2518 # BOX DRAWINGS LIGHT UP AND LEFT
1B ---92-------D5---- 0X2019 # RIGHT SINGLE QUOTATION MARK
1C ------BC-AE----BC- 0X255D # BOX DRAWINGS DOUBLE UP AND LEFT
1C ---93-------D2---- 0X201C # LEFT DOUBLE QUOTATION MARK
1D ------C8-AB----C8- 0X255A # BOX DRAWINGS DOUBLE UP AND RIGHT
1D ---94-------D3---- 0X201D # RIGHT DOUBLE QUOTATION MARK
1E ------BB-A8----BB- 0X2557 # BOX DRAWINGS DOUBLE DOWN AND LEFT
1E ---84-------D7---- 0X201E # DOUBLE LOW-9 QUOTATION MARK
03 ------------A3---- 0X00A3 # POUND SIGN
03 ------DA-82----DA- 0X250C # BOX DRAWINGS LIGHT DOWN AND RIGHT
03 ---82------------- 0X201A # SINGLE LOW-9 QUOTATION MARK

PC855/PC866 splittings
24 ---------99------- 0X2265 # GREATER-THAN OR EQUAL TO *)
24 A4-AA-F2----B8-87- 0X0404 # CYRILLIC CAPITAL LETTER UKRAINIAN IE
2E ---------9F------- 0X00F7 # DIVISION SIGN *)
2E AE-A1-F6----D8-99- 0X040E # CYRILLIC CAPITAL LETTER SHORT U
74 ---------98------- 0X2264 # LESS-THAN OR EQUAL TO *)
74 F4-BA-F3----B9-86- 0X0454 # CYRILLIC SMALL LETTER UKRAINIAN IE
7E ---------97------- 0X2248 # ALMOST EQUAL TO *)
7E FE-A2-F7----D9-98- 0X045E # CYRILLIC SMALL LETTER SHORT U

The symbols looks more or less like left/right angle quotation.
20 ------B7-A7------- 0X2556 # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
20 ---AB-------C7-AE- 0X00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
2D ------D6-A4------- 0X2553 # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
2D ---BB-------C8-AF- 0X00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
07 ------------B2---- 0X2264 # LESS-THAN OR EQUAL TO *)
07 ------B9-B5----B9- 0X2563 # BOX DRAWINGS DOUBLE VERTICAL AND LEFT
07 ---8B------------- 0X2039 # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
09 ------------B3---- 0X2265 # GREATER-THAN OR EQUAL TO *)
09 ------CC-B1----CC- 0X2560 # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
09 ---9B------------- 0X203A # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK

Other symbols
70 ---------9D------- 0X00B2 # SUPERSCRIPT TWO
70 F0-B9-FC----DC-EF- 0X2116 # NUMERO SIGN
7D ------FA-9E------- 0X00B7 # MIDDLE DOT *)
7D FD-A7-------A4-FD- 0X00A7 # SECTION SIGN
10 ------DC-------DC- 0X2584 # LOWER HALF BLOCK *)
10 ---A9----BF-A9---- 0X00A9 # COPYRIGHT SIGN
11 ------B3-81----B3- 0X2502 # BOX DRAWINGS LIGHT VERTICAL
11 ---AC-------C2---- 0X00AC # NOT SIGN
12 ------C5-8A----C5- 0X253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
12 ---AE-------A8---- 0X00AE # REGISTERED SIGN
13 ------BF-83----BF- 0X2510 # BOX DRAWINGS LIGHT DOWN AND LEFT
13 ---B1-------B1---- 0X00B1 # PLUS-MINUS SIGN
14 ------CD-A0----CD- 0X2550 # BOX DRAWINGS DOUBLE HORIZONTAL
14 ---B5-------B5---- 0X00B5 # MICRO SIGN
15 ------BA-A1----BA- 0X2551 # BOX DRAWINGS DOUBLE VERTICAL
15 ---B6-------A6---- 0X00B6 # PILCROW SIGN
18 ------C2-88----C2- 0X252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
18 ---96-------D0---- 0X2013 # EN DASH
19 ------C1-89----C1- 0X2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL
19 ---97-------D1---- 0X2014 # EM DASH
1F ------C4-80----C4- 0X2500 # BOX DRAWINGS LIGHT HORIZONTAL
1F ---86-------A0---- 0X2020 # DAGGER
00 ------C9-A5----C9- 0X2554 # BOX DRAWINGS DOUBLE DOWN AND RIGHT
00 ---95-------A5---- 0X2022 # BULLET
01 ------B0-90----B0- 0X2591 # LIGHT SHADE
01 ---85-------C9---- 0X2026 # HORIZONTAL ELLIPSIS
02 ------CB-B8----CB- 0X2566 # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
02 ---99-------AA---- 0X2122 # TRADE MARK SIGN
04 ------------AD---- 0X2260 # NOT EQUAL TO
04 ------CA-BB----CA- 0X2569 # BOX DRAWINGS DOUBLE UP AND HORIZONTAL
04 ---87------------- 0X2021 # DOUBLE DAGGER
05 ------------B0---- 0X221E # INFINITY
05 ------CE-BE----CE- 0X256C # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
05 ---88------------- 0X0088 # NOT USED
06 ------------C6---- 0X2206 # INCREMENT
06 ------DF-8B----DF- 0X2580 # UPPER HALF BLOCK
06 ---89------------- 0X2030 # PER MILLE SIGN
08 88-A0-FF-9A-CA-FF- 0X00A0 # NO-BREAK SPACE
0A ------------D6---- 0X00F7 # DIVISION SIGN *)
0A ------B1-91----B1- 0X2592 # MEDIUM SHADE
0A ---A6------------- 0X00A6 # BROKEN BAR
0B ------------C4---- 0X0192 # LATIN SMALL LETTER F WITH HOOK
0B ------B2-92----B2- 0X2593 # DARK SHADE
0B ---B7------------- 0X00B7 # MIDDLE DOT *)
0C ------------C5---- 0X2248 # ALMOST EQUAL TO *)
0C ------FE-94----FE- 0X25A0 # BLACK SQUARE
0C ---98------------- 0X0098 # NOT USED
0D ---------------DB- 0X2588 # FULL BLOCK *)
0D ---B0-F8-9C-A1---- 0X00B0 # DEGREE SIGN
0E ------FB-96-C3---- 0X221A # SQUARE ROOT
0E AD-AD----------F0- 0X00AD # SOFT HYPHEN
0F ---------8C------- 0X2584 # LOWER HALF BLOCK *)
0F ---A4-FD----FF-CF- 0X00A4 # CURRENCY SIGN
*) for some coding tables

----------------------- Конец файла RECODE.BAS -----------------------
*/