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