> то самому слабо набросать программку скажем на
>C на пару сотен строк (вместе с cp1251-unicode таблицей) ?
Можно я скажу! Возмите мой!
Только таблицу надо добавить, utf нету
:-)))
/**
* @(#) Easy recoder windows-1251 <-> koi8-r <-> cp866
*
* @author Andrew Wingborn mailto://programmer_coolsoft_ru
* @version 0.9
* @date 2004-02-22
*
* $FreeBSD$
*
* set tabstop=4
*/
#include <stdio.h>
#include <string.h>
int chars[256];
int win[] = {
0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,
0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,
0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,
0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,
0xdc,0xdd,0xde,0xdf,0xe0,0xe1,0xe2,
0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,
0xea,0xeb,0xec,0xed,0xee,0xef,0xf0,
0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,
0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,
0xff,0xa8,0xb8
};
int koi[] = {
0xe1,0xe2,0xf7,0xe7,0xe4,0xe5,0xf6,
0xfa,0xe9,0xea,0xeb,0xec,0xed,0xee,
0xef,0xf0,0xf2,0xf3,0xf4,0xf5,0xe6,
0xe8,0xe3,0xfe,0xfb,0xfd,0xff,0xf9,
0xf8,0xfc,0xe0,0xf1,0xc1,0xc2,0xd7,
0xc7,0xc4,0xc5,0xd6,0xda,0xc9,0xca,
0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd2,
0xd3,0xd4,0xd5,0xc6,0xc8,0xc3,0xde,
0xdb,0xdd,0xdf,0xd9,0xd8,0xdc,0xc0,
0xd1,0xb3,0xa3
};
int dos[] = {
0x80,0x81,0x82,0x83,0x84,0x85,0x86,
0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,
0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,
0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,
0x9c,0x9d,0x9e,0x9f,0xa0,0xa1,0xa2,
0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,
0xaa,0xab,0xac,0xad,0xae,0xaf,0xe0,
0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,
0xef,0xf0,0xf1
};
struct args {
char *call_name;
int *src;
int *dst;
}
code[] = {
{ "win2koi", win, koi },
{ "win2dos", win, dos },
{ "koi2win", koi, win },
{ "koi2dos", koi, dos },
{ "dos2win", dos, win },
{ "dos2koi", dos, koi },
};
#define SIZE sizeof(koi)/sizeof(i)
FILE *input, *output;
void
err_quit(const char *msg)
{
fprintf(stderr, "%s\n", msg);
exit(1);
}
FILE*
Open(const char *name, const char *mode)
{
FILE *fp;
if( (fp = fopen(name, mode)) == NULL)
err_quit("do not open file");
return(fp);
}
void
recode(int func)
{
int i;
for(i=0; i < 256; i++)
chars[i] = i;
for (i=0; i < SIZE; i++)
chars[ code[func].src[i] ] = code[func].dst[i];
while( (i = fgetc(input)) != EOF)
fputc(chars[i], output);
exit(0);
}
int
main(int argc,char* argv[])
{
int i;
if(argc > 3)
err_quit("man win2koi");
input = stdin ;
output = stdout;
if(argc == 3)
if(argv[1][0] != '-')
input = Open(argv[1], "r");
if(argc > 1)
if(argv[ argc-1 ][0] != '-')
output = Open(argv[ argc-1 ], "a");
for(i=0; i < sizeof(code)/sizeof(struct args); i++)
if( strstr(argv[0], code[i].call_name) != NULL)
recode(i);
fprintf(stderr, "%s: ", argv[0]);
err_quit("unknown function");
}
//
//#EOF