Сервисы
Лоция
Отзывы
ПерЧАТка
Программы
Игры
Учебники
Справочники
Миелофон







Яндекс цитирования
 
Информация
На нашем сервере открыта интернет-аптека, где Вы можете приобретать медикаменты не выходя из дома!


GISMETEO: Погода по г.Екатеринбург



 
 

Perl для CGI / Разное по теме


Изображения ismap


После такой серьезной темы как обработка форм, перейду к чему-нибудь веселенькому. Я познакомлю вас с изображениями ismap потому что это просто есть такой способ. Он поддерживается браузерами и естественно имеет право на жизнь. Хотя с приходом новых веяний в HTML (особенно Java-аплетов) он стал настоящей редкостью. Хотя можно в 80% случаев найти ему более быструю замену, все-же вы можете в некоторых случаях найти именно ismap предпочтительней всего.

Синтаксис очень простой, почти не отличается от того, если бы вы решили оформить рисунок для якорь-гиперссылки:

<A href="cgi-bin/somescript.cgi"><IMG src="somepic.gif" border=0 ismap></A>

Заметьте, что все отличие заключается в том, что в тэге IMG добавлен атрибут ismap. Он говорит браузеру, что когда пользователь щелкнет на картинке то нужно перейти не просто к URL указаному в <A href="URL">, а что нужно к этому URL добавить координаты той точки по которой пользователь щелкнул мышью.

В нашем примере если пользователь щелкнул по точке x=10, y=15 то браузер перейдет на URL:
http://www.somehost.ru/cgi-bin/somescript.cgi?10,15
Т.е. координаты идут на скрипте в переменную QUERY_STRING. Как их оттуда извлечь? Нет ничего проще:

($x,$y)=split(/,/,$ENV{'QUERY_STRING'});

Вот скрипт, который просто показывает координаты точки щелчка:

#!/usr/bin/perl
#ismap_xy.cgi
($x,$y)=split(/,/,$ENV{'QUERY_STRING'});
print "Content-Type: text/html\n\n";
print "<HTML><HEAD><TITLE>Ismap X Y</TITLE></HEAD>";
print "<BODY><H1>Вы щелкнули в точке: x=$x ,y=$y</H1></BODY></HTML>";

А что с ними делать дальше это уже зависит только от вашей фантазии. Дайте ей ход и все у вас получится! Очень часто ismap применяют для графического оглавления сайта. Когда щелкают на разные части рисунка, то переходят к разным страничкам сайта. Это легко реализуется, если скрипт выдаст нужный URL в Location: (вспомните заголовок ответа CGI).

Вот пример, который покажет это. Заготовьте файл urlmap.txt в котором будет информация из строк в таком формате: minx miny maxx maxy URL, где minx miny maxx maxy задают участок рисунка, а следующее за ними поле задает URL, которому этот участок соответствует. Пример:

1 1 20 50 http://www.uic.nnov.ru/~paaa/index_p.html
1 50 20 100 http://www.uic.nnov.ru/~paaa/projects.html
20 1 100 100 http://www.uic.nnov.ru/~paaa/cgi-bin/guestbook.cgi

Где нибудь на своей страничке воткните что-то вроде:

<A href="cgi-bin/testismap.cgi"><IMG src="gifs/doom2.jpg" border=0 ismap></A>

А сам скрипт testismap.cgi будет иметь вот такой простенький вид:

#!/usr/bin/perl
#testismap.cgi
$default_url="http://www.uic.nnov.ru/~paaa/"; #URL по умолчанию, переходим к нему когда щелкнули
#в участок, которому не сопоставлен URL
$url_map_file="urlmap.txt"; #файл с информацией об URL

($x,$y)=split(/,/,$ENV{'QUERY_STRING'});
open(F,"$url_map_file")|| print "Location: $default_url\n\n";
$url=$default_url;
foreach(<F>){
chomp;
($minx,$miny,$maxx,$maxy,$URL)=split(/\s+/);
if(($x>=$minx)&&($x<$maxx)&&
($y>=$miny)&&($x<$maxy)){$url=$URL;}
}
close(F);
print "Location: $url\n\n";

Анимация


Когда говорят о каком-то популярном сайте, то частенько к приемуществам относят и анимацию. Действительно, когда изображение изменяется (и особенно к месту ;)), то это смотрится и пользователю нравится.

Говоря об анимации нужно сразу отметить что нет лучшего способа. Анимацию можно сделать ДЕСЯТКАМИ способов, каждый хорош в своей области применения. Я перечислю только некоторые из них, которые чаще всего применяются:

  • Самый простой, но наименее функциональный способ это GIF-анимация.
  • Потом можно воткнуть анимационный файл MPEG или AVI, они более отражают суть анимации, но имеют недостаток: для проигрывания их на некоторых браузерах нужны специальные подключаемые модули. К тому же они не интерактивны.
  • Можно реализовать анимацию в рамках Java-апплета, когда апплет находясь на страничке сам перерисовывается со временем. Таким же интерактивным средством служит обращение к массиву document.images[] из JavaScript. Достоинство, помимо интерактивности, полная интегрированость с HTML-станичкой. Но может как и предыдущий использоваться только с относительно новыми браузерами, которые поддерживают Java и JavaScript.

В общем в каждом случае выбор остается за вами. Вам решать насколько тот или иной способ хорош в вашей ситуации. Я же познакомлю вас с еще одним. Вы уже были ознакомлены с этим способом, когда я вам рассказывал о nph-скриптах. Теперь, когда вы уже так много знаете, можно модифицировать тот пример, добавив в него вызов картинки по случайному принципу:

#!/usr/bin/perl
#nph-animate2.cgi
$delay=3;
@files = qw(img0.gif img1.gif img2.gif img3.gif);

select (STDOUT);
$|=1; #autoflush mode on
#Generate header
print "HTTP/1.0 200 Okay\n";
print "Content-Type: multipart/x-mixed-replace;boundary=myboundary\n\n";
srand;
print "--myboundary\n";
while(1){
$file=$files[int(rand($#files))]; #random file
print "Content-Type: image/gif\n\n";
open(PIC,"$file");
print <PIC>;
close(PIC);
print "\n--myboundary\n";
sleep($delay);
}

Конечно это одно из самых примитивных применений такой системы. Более мощным примером могло бы послужить отслеживание на сервере какого-нибудь периодически изменяющегося файла и пересылка пользователю обновленной версии. Такая Система применяется например в Чате, при появлении новых сообщений. Чатовая система достаточно сложна для этого пособия и я не стал сюда ее включать.Однако, если вам очень интересно, то я с удовольствием пришлю ее вам.


Несколько советов по отладке


CGI-программы - не самые простые в отладке. По сложности отладки они способны сравнится лишь с отладкой драйверов. Вся сложность заключается в том, что скрипт выполняется не как обычная программа. Он выполняется в специальной среде сервера, которая создается при клиентском запросе. К тому же он исполняется не из под вашего аккаунта, а на непривилегированом уровне.

Если скрипт не исполняется потому что вы допустили синтаксические ошибки, то самих этих ошибок вы не увидите. На экране будет только 'Internal Server Error' из-за чего она произошла вы можете только гадать (некоторые серверы настроены так, что ведут подробный лог ошибок, тогда вам повезло). Также если вы забыли задать к какому-то файлу нужные права доступа, то тоже будет трудно выяснить что же произошло и в чем причина ошибки (если конечно к этому вы не готовы). Но хватит вас пугать, тем более что нас не запугаешь ;)!

Приступим к отладке. Я вам опишу достаточно примитивные меры, которыми сам пользуюсь.

Начнем с того что у нас есть скрипт test.cgi мы уже сделали его исполняемым chmod +x test.cgi. Простейший способ проверить его на ошибки это команда perl -c test.cgi. Ключ -c говорит Perl, что надо только проверить синтаксис. Все сообщения об ошибках вы можете видеть и подправить. Более тяжелый случай состоит в том когда Perl встроен в Web-Сервер, причем версии разные. Как до недавнего времени было на uic'е ;(( ! Тот Perl с которым работаем в командной строке 4-й версии, а на сервере стоит 5-й версии. Если ваша CGI-программа использует при этом какие-нибудь преимущества 5-й версии (например обьектно-ориентированые модули), то вы думаете отладить ее низя? Ошибаетесь! Только приготовтесь к тому, что я сейчас скажу... вы сядьте, а то упадете ;)) : Закомментируйте всю вашу программу, т.е. перед каждой строчкой поставьте символ '#'. После этого, добавьте вот такие строчки: print "Content-Type: text/html\n\n"; print "<HTML>Test</HTML>"; exit; . Должно получится так:

#!/usr/bin/perl
#test.cgi
print "Content-Type: text/html\n\n";
print "<HTML>Test</HTML>";
exit; #Программа как вы понимаете выполняется только до етого места
#
#if($ENV{'REQUEST_METHOD'} eq 'GET'){$query=$ENV{'QUERY_STRING'}}
#else{sysread STDIN,$query,$ENV{'CONTENT_LENGTH'};}
#if($query eq ''){
# @formfields=split /&/,$query;
# .......
# ........

А теперь запускайте скрипт. Естественно он выдаст одно только слово 'Test'. Раскомментируйте несколько строчек. Еще раз запустите скрипт. Он опять выдаст 'Test'. Значит синтаксически эти только что раскомментированые строчки были правильные. И так далее...

Если в очередной раз после раскомментирования вы запустили скрипт и получили 'Internal Server Error' - значит в этих строках содержалась какая-то синтаксическая ошибка. Это способ отловки синтаксических ошибок трудоемок, но к нему придется прибегнуть если ваш скрипт писан под ту версию Perl, что на сервере, а не под ту что у вас.

Узнать версию Perl можно perl -v

Ну вот мы отловили в нашем скрипте все синтаксические ошибки, он заработал, но это не значит что он работает правильно. Что еще можно посоветовать при отладке CGI-скриптов от ошибок возникающих во время выполнения программы. Допустим какой-то файл не открылся. Конечно показывать перепуганому пользователю эти технические подробности никчему, поэтому заведите себе специальный файл debug.txt и пусть ваши скрипты пишут в этот файл причины своих ошибок и сбоев, да и вообще о всех непредвиденых событиях. Это можно реализовать так:

sub debug_err{
open(DEBUGFILE,">>debug.txt");
print DEBUGFILE $ENV{'SCRIPT_NAME'}.' '.scalar localtime.' '.@_."\n";
close(DEBUGFILE);
}

Напомню, что встроеная переменная Perl $! содержит сообщение о причине последней ошибки, поэтому включайте ее всегда в свои логи:

open(F,"+<$myfile") || debug_err("Cannot open $myfile $!");
seek(F,0,0) || debug_err("Cannot seek $myfile $!");
connect(SOCKET,$paddr)|| debug_err("Cannot connect to $remote $!");
......

Потом можно периодически заглядывать в файл debug.txt и смотреть, какие ошибки встречались при работе ваших скриптов. Таким образом ваши скрипты сами будут помогать в своей отладке ;).

Также очень может оказать помощь (может и не оказать) просмотр http-шных логов. Все обращения к URL на сервере и все возникающие при этом ошибки идут в логи сервера httpd. Сразу хочу предупредить - размеры этих логов даже на средних размеров сервере достигает десятков мегабайт. Поэтому даже не пытайтесь их вот так просто посмотреть. Лучше если вы уж за данное дело взялись - воспользуйтесь такими утилитами как grep, head, tail, more, less.

Кстати я хочу напомнить о причине еще одной (совсем не очевидной) ошибки. Если вы набрали скрипт у себя дома на компутере, то полученный скрипт состоит из текста в DOS(Win) формате, а не в Unix. Запускать вам его придется в системе Unix , так что следует перевести програмный текст в нужный формат. Дело в том что в системах DOS и Windows (это уж очередной раз скажите все что вы думаете о Билле Гейтсе и Ко) для разделения строк используется не один "символ новой строки" ("\n"), а пара символов "возврат каретки" ("\r") и "символ новой строки" ("\n"). Для простых HTML-файлов это не критично - браузеры игнорируют такие символы при выводе. Но скрипт является ПРОГРАММОЙ. А в программе никаких символов возврата каретки быть не должно!! Особенно в первой строке. Потому что когда операционная система запускает скрипт, она определяет какое приложение запустить для обработки данного скрипта именно по первой строке. В первой строке как вы знаете содержится #!/usr/bin/perl или #!/usr/local/bin/perl. Поэтому при запуске скрипта mysrcipt (это кстати вы можете сами увидеть коммандами top и ps) Система запускает команду /usr/bin/perl mysript. А теперь представьте что будет если не убрать символ возврата каретки из Windows-файла. Получиться #!/usr/bin/perl<возврат каретки> и естественно что такого приложения нет, и следовательно попытка выполнить коммаду /usr/bin/perl<возврат каретки> mysript ни к чему не приведет!!! Как с таким злом бороться я расcкажу в следующем параграфе.

Trics and traps

Я вам в этой части расскажу о всяких тонких и неочевидных местах и о том как с этим боротся.

Для удаления символов возврата каретки (этот процесс как и все я максимально автоматизирую) служит коротенький скрипт delcr. Просто "натравливайте" его на ваши скрипты:delcr *.cgi

#!/usr/bin/perl
#delcr
unless(@ARGV){die "Usage: delcr file ....\n";}
foreach $file(@ARGV){
if(! -r $file || ! -w $file){print "$file: access denied\n";}
else{
open(F,"+<$file")|| die "Cannot open $file $!\n";
binmode(F) || die "Cannot binmode $file $!\n";
@D=<F>;
seek(F,0,0);
foreach(@D){
s/\r//g;
print F;
}
truncate(F,tell(F));
close(F);
}
}

Саму же взаимную перекодировку Dos<->koi-8<->Win поможет выполнить вот такая прога. Написал я ее очень давно, даже раньше чем занялся CGI программированием и с тех давних пор она меня все время выручала, став моим по-настоящему незаменимым и верным другом. Итак, знакомьтесь: txtconv - Утилита перевода раскладок символов:

#include<stdio.h>
#include<string.h>
/*****************/
char tbldw[256]={
0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xb,0xc,0xd,0xe,0xf,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,
0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0x34,0x35,0x36,
0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,
0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,
0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,
0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,
0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,
0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,

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,0x5f,0x5f,0x5f,0xa6,0xa6,0xa6,0xa6,0x2b,0x2b,
0xa6,0xa6,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2d,0x2d,0x2b,0x2d,0x2b,
0xa6,0xa6,0x2b,0x2b,0x2d,0x2d,0xa6,0x2d,0x2b,0x2d,0x2d,0x2d,0x2d,
0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x5f,0x5f,0x5f,0x5f,0x5f,
0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,
0xfd,0xfe,0xff,0xa8,0xb8,0xaa,0xba,0xaf,0xbf,0xa1,0xa2,0xb0,0x95,
0xb7,0x5f,0xb9,0xa4,0x5f,0x5f};

char tblwd[256]={
0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xb,0xc,0xd,0xe,0xf,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,
0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0x34,0x35,0x36,
0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,
0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,
0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,
0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,
0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,
0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,

0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,
0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0xf9,0x5f,0x5f,0x5f,0x5f,
0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0xf6,0xf7,0x5f,0xfd,0x5f,0x7c,
0x15,0xf0,0x63,0xf2,0x11,0x2d,0x2d,0x72,0xf4,0xf8,0x5f,0x49,0x69,
0x5f,0x5f,0x14,0xfa,0xf1,0xfc,0xf3,0x10,0x5f,0x5f,0x5f,0xf5,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};

char tbl_asc[256]={
0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xb,0xc,0xd,0xe,0xf,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,
0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0x34,0x35,0x36,
0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,
0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,
0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,
0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,
0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,
0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f};

char tbldu[256]={
0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xb,0xc,0xd,0xe,0xf,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,
0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0x34,0x35,0x36,
0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,
0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,
0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,
0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,
0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,
0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,

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,0x90,0x91,0x92,0x81,
0x87,0xB2,0xB4,0xA7,0xA6,0xB5,0xA1,0xA8,0xAE,0xAD,0xAC,0x83,0x84,
0x89,0x88,0x86,0x80,0x8A,0xAF,0xB0,0xAB,0xA5,0xBB,0xB8,0xB1,0xA0,
0xBE,0xB9,0xBA,0xB6,0xB7,0xAA,0xA9,0xA2,0xA4,0xBD,0xBC,0x85,0x82,
0x8D,0x8C,0x8E,0x8F,0x8B,0xD2,0xD3,0xD4,0xD5,0xC6,0xC8,0xC3,0xDE,
0xDB,0xDD,0xDF,0xD9,0xD8,0xDC,0xC0,0xD1,0xB3,0xA3,0x99,0x98,0x93,
0x9B,0x9F,0x97,0x9C,0x95,0x9E,0x96,0xBF,0x9D,0x94,0x9A};

char tblud[256]={
0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xb,0xc,0xd,0xe,0xf,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,
0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0x34,0x35,0x36,
0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,
0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,
0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,
0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,
0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,
0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,

0xC4,0xB3,0xDA,0xBF,0xC0,0xD9,0xC3,0xB4,0xC2,0xC1,0xC5,0xDF,0xDC,
0xDB,0xDD,0xDE,0xB0,0xB1,0xB2,0xF4,0xFE,0xF9,0xFB,0xF7,0xF3,0xF2,
0xFF,0xF5,0xF8,0xFD,0xFA,0xF6,0xCD,0xBA,0xD5,0xF1,0xD6,0xC9,0xB8,
0xB7,0xBB,0xD4,0xD3,0xC8,0xBE,0xBD,0xBC,0xC6,0xC7,0xCC,0xB5,0xF0,
0xB6,0xB9,0xD1,0xD2,0xCB,0xCF,0xD0,0xCA,0xD8,0xD7,0xCE,0xFC,0xEE,
0xA0,0xA1,0xE6,0xA4,0xA5,0xE4,0xA3,0xE5,0xA8,0xA9,0xAA,0xAB,0xAC,
0xAD,0xAE,0xAF,0xEF,0xE0,0xE1,0xE2,0xE3,0xA6,0xA2,0xEC,0xEB,0xA7,
0xE8,0xED,0xE9,0xE7,0xEA,0x9E,0x80,0x81,0x96,0x84,0x85,0x94,0x83,
0x95,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x9F,0x90,0x91,0x92,
0x93,0x86,0x82,0x9C,0x9B,0x87,0x98,0x9D,0x99,0x97,0x9A};

char tbluw[256]={
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,
0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,
0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,
0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,
0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,0x40,
0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,
0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,
0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,
0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,

0x2D,0xA6,0x2B,0x2B,0x2B,0x2B,0x2B,0xA6,0x2D,0x2D,0x2B,0x5F,0x5F,
0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0xAF,0x5F,0x95,0x5F,0xA2,0xBA,0xAA,
0x5F,0xBF,0xB0,0xA4,0xB7,0xA1,0x2D,0xA6,0x2B,0xB8,0x2B,0x2B,0x2B,
0x2B,0x2B,0x2B,0x2B,0x2B,0x2B,0x2B,0x2B,0xA6,0xA6,0xA6,0xA6,0xA8,
0xA6,0xA6,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2B,0x2B,0x2B,0xB9,0xFE,
0xE0,0xE1,0xF6,0xE4,0xE5,0xF4,0xE3,0xF5,0xE8,0xE9,0xEA,0xEB,0xEC,
0xED,0xEE,0xEF,0xFF,0xF0,0xF1,0xF2,0xF3,0xE6,0xE2,0xFC,0xFB,0xE7,
0xF8,0xFD,0xF9,0xF7,0xFA,0xDE,0xC0,0xC1,0xD6,0xC4,0xC5,0xD4,0xC3,
0xD5,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xDF,0xD0,0xD1,0xD2,
0xD3,0xC6,0xC2,0xDC,0xDB,0xC7,0xD8,0xDD,0xD9,0xD7,0xDA};

char tblwu[256]={
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,
0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,
0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,
0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,
0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,0x40,
0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,
0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,
0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,
0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,

0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,
0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x95,0x5F,0x5F,0x5F,0x5F,
0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x9F,0x97,0x5F,0x9D,0x5F,0x7C,
0x15,0xB3,0x63,0x99,0x11,0x2D,0x2D,0x72,0x93,0x9C,0x5F,0x49,0x69,
0x5F,0x5F,0x14,0x9E,0xA3,0xBF,0x98,0x10,0x5F,0x5F,0x5F,0x9B,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};
/*****************/
int convert(unsigned char *buff,unsigned char *Tbl,int count)
{
int i;
for(i=0;i<count;i++)buff[i]=Tbl[(unsigned)buff[i]];
return 0;
}
/*****************/
char szHelp[]=
"Text file converter (c)lesha 1998\n"
"Usage:txtconv <options> <srcfile> <dstfile>\n"
" options: -ud koi8->dos\n"
" -du dos->koi8\n"
" -uw koi8->win\n"
" -wu win->koi8\n"
" -dw dos->win\n"
" -wd win->dos\n"
" -? -This help\n";
int main(int argc,char *argv[])
{
FILE *f1;
FILE *f2;
char tmpbuff[1024];
char *xtbl=NULL;
int nr;
if((argc>1)&&(strcmp(argv[1],"-?")==0)){printf(szHelp);return 0;}
if(argc<4){printf(szHelp);return 0;}
if (strcmp(argv[1],"-ud")==0)xtbl=tblud;
else if(strcmp(argv[1],"-du")==0)xtbl=tbldu;
else if(strcmp(argv[1],"-uw")==0)xtbl=tbluw;
else if(strcmp(argv[1],"-wu")==0)xtbl=tblwu;
else if(strcmp(argv[1],"-dw")==0)xtbl=tbldw;
else if(strcmp(argv[1],"-wd")==0)xtbl=tblwd;
if(xtbl==NULL){printf("unknown option:%s",argv[1]);return 1;}
if((f1=fopen(argv[2],"rb"))==NULL){perror(argv[2]);return 1;}
if((f2=fopen(argv[3],"wb"))==NULL){fclose(f1);perror(argv[3]);return 1;}
while((nr=fread(tmpbuff,1,sizeof(tmpbuff),f1))>0)
{
convert(tmpbuff,xtbl,nr);
fwrite(tmpbuff,1,nr,f2);
}
fclose(f1);
fclose(f2);
return 0;
}

Это еще одна утилита, которая поможет вам в тяжелой реальности Интернета ;). Скомпилить ее можно под все три системы и используется она после этого очень легко, особенно когда всегда под рукой.

В общем что я могу сказать. У вас на пути будет немало трудностей, но их можно преодолеть используя нехитрые приспособления. Желаю вам удачи. А пока посмотрите на некоторые примеры приложений, возможно они вам будут полезны.