Trics and traps

Автор: manager Среда, Апрель 2nd, 2008 Нет комментариев

Рубрика: CGI-программирование

Я так решил назвать эту часть,потому что это название больше всего соответствует.

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

Продолжая тему отладки, я столкнулся с такой неочевидной проблеммой, помимо того,что надо перевести раскладку Windows (или DOS) в koi8-r На некоторых серверах (в том числе на нашем UIC’овском) скрипт все равно отказывался работать. Признаюсь ,хоть и разобрался в чем дело я быстро, причина весьма неочевидна: Дело в том,что текстовый файл Windows содержит перед символом перехода на новую строку еще символ возврата каретки. А вот из-за этого скрипт и отказывался выполнятся, что содержал этот символ!

Методом решения (этот процесс как и все я максимально автоматизирую) стал коротенький скрипт 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=;
seek F,0,0;
foreach(@D){
s/\r//g;
print F;
}
truncate F,tell(F);
close F;
}
}

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

#include
#include
/*****************/
char tbldw[256]={
0×0,0×1,0×2,0×3,0×4,0×5,0×6,0×7,0×8,0×9,0xa,0xb,0xc,0xd,0xe,0xf,
0×10,0×11,0×12,0×13,0×14,0×15,0×16,0×17,0×18,0×19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
0×20,0×21,0×22,0×23,0×24,0×25,0×26,0×27,0×28,0×29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
0×30,0×31,0×32,0×33,0×34,0×35,0×36,0×37,0×38,0×39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
0×40,0×41,0×42,0×43,0×44,0×45,0×46,0×47,0×48,0×49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
0×50,0×51,0×52,0×53,0×54,0×55,0×56,0×57,0×58,0×59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
0×60,0×61,0×62,0×63,0×64,0×65,0×66,0×67,0×68,0×69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
0×70,0×71,0×72,0×73,0×74,0×75,0×76,0×77,0×78,0×79,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,0×95,0xb7,0x5f,0xb9,0xa4,0x5f,0x5f
};
char tblwd[256]={
0×0,0×1,0×2,0×3,0×4,0×5,0×6,0×7,0×8,0×9,0xa,0xb,0xc,0xd,0xe,0xf,
0×10,0×11,0×12,0×13,0×14,0×15,0×16,0×17,0×18,0×19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
0×20,0×21,0×22,0×23,0×24,0×25,0×26,0×27,0×28,0×29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
0×30,0×31,0×32,0×33,0×34,0×35,0×36,0×37,0×38,0×39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
0×40,0×41,0×42,0×43,0×44,0×45,0×46,0×47,0×48,0×49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
0×50,0×51,0×52,0×53,0×54,0×55,0×56,0×57,0×58,0×59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
0×60,0×61,0×62,0×63,0×64,0×65,0×66,0×67,0×68,0×69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
0×70,0×71,0×72,0×73,0×74,0×75,0×76,0×77,0×78,0×79,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,0×15,0xf0,0×63,0xf2,0×11,0x2d,0x2d,0×72,0xf4,
0xf8,0x5f,0×49,0×69,0x5f,0x5f,0×14,0xfa,0xf1,0xfc,0xf3,0×10,0x5f,0x5f,0x5f,0xf5,
0×80,0×81,0×82,0×83,0×84,0×85,0×86,0×87,0×88,0×89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
0×90,0×91,0×92,0×93,0×94,0×95,0×96,0×97,0×98,0×99,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]={
0×0,0×1,0×2,0×3,0×4,0×5,0×6,0×7,0×8,0×9,0xa,0xb,0xc,0xd,0xe,0xf,
0×10,0×11,0×12,0×13,0×14,0×15,0×16,0×17,0×18,0×19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
0×20,0×21,0×22,0×23,0×24,0×25,0×26,0×27,0×28,0×29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
0×30,0×31,0×32,0×33,0×34,0×35,0×36,0×37,0×38,0×39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
0×40,0×41,0×42,0×43,0×44,0×45,0×46,0×47,0×48,0×49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
0×50,0×51,0×52,0×53,0×54,0×55,0×56,0×57,0×58,0×59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
0×60,0×61,0×62,0×63,0×64,0×65,0×66,0×67,0×68,0×69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
0×70,0×71,0×72,0×73,0×74,0×75,0×76,0×77,0×78,0×79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f
};
char tbldu[256]={
0×0,0×1,0×2,0×3,0×4,0×5,0×6,0×7,0×8,0×9,0xa,0xb,0xc,0xd,0xe,0xf,
0×10,0×11,0×12,0×13,0×14,0×15,0×16,0×17,0×18,0×19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
0×20,0×21,0×22,0×23,0×24,0×25,0×26,0×27,0×28,0×29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
0×30,0×31,0×32,0×33,0×34,0×35,0×36,0×37,0×38,0×39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
0×40,0×41,0×42,0×43,0×44,0×45,0×46,0×47,0×48,0×49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
0×50,0×51,0×52,0×53,0×54,0×55,0×56,0×57,0×58,0×59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
0×60,0×61,0×62,0×63,0×64,0×65,0×66,0×67,0×68,0×69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
0×70,0×71,0×72,0×73,0×74,0×75,0×76,0×77,0×78,0×79,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,
0×90,0×91,0×92,0×81,0×87,0xB2,0xB4,0xA7,0xA6,0xB5,0xA1,0xA8,0xAE,0xAD,0xAC,0×83,
0×84,0×89,0×88,0×86,0×80,0x8A,0xAF,0xB0,0xAB,0xA5,0xBB,0xB8,0xB1,0xA0,0xBE,0xB9,
0xBA,0xB6,0xB7,0xAA,0xA9,0xA2,0xA4,0xBD,0xBC,0×85,0×82,0x8D,0x8C,0x8E,0x8F,0x8B,
0xD2,0xD3,0xD4,0xD5,0xC6,0xC8,0xC3,0xDE,0xDB,0xDD,0xDF,0xD9,0xD8,0xDC,0xC0,0xD1,
0xB3,0xA3,0×99,0×98,0×93,0x9B,0x9F,0×97,0x9C,0×95,0x9E,0×96,0xBF,0x9D,0×94,0x9A
};
char tblud[256]={
0×0,0×1,0×2,0×3,0×4,0×5,0×6,0×7,0×8,0×9,0xa,0xb,0xc,0xd,0xe,0xf,
0×10,0×11,0×12,0×13,0×14,0×15,0×16,0×17,0×18,0×19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
0×20,0×21,0×22,0×23,0×24,0×25,0×26,0×27,0×28,0×29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
0×30,0×31,0×32,0×33,0×34,0×35,0×36,0×37,0×38,0×39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
0×40,0×41,0×42,0×43,0×44,0×45,0×46,0×47,0×48,0×49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
0×50,0×51,0×52,0×53,0×54,0×55,0×56,0×57,0×58,0×59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
0×60,0×61,0×62,0×63,0×64,0×65,0×66,0×67,0×68,0×69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
0×70,0×71,0×72,0×73,0×74,0×75,0×76,0×77,0×78,0×79,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,0×80,0×81,0×96,0×84,0×85,0×94,0×83,0×95,0×88,0×89,0x8A,0x8B,0x8C,0x8D,0x8E,
0x8F,0x9F,0×90,0×91,0×92,0×93,0×86,0×82,0x9C,0x9B,0×87,0×98,0x9D,0×99,0×97,0x9A
};
char tbluw[256]={
0×00,0×01,0×02,0×03,0×04,0×05,0×06,0×07,0×08,0×09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
0×10,0×11,0×12,0×13,0×14,0×15,0×16,0×17,0×18,0×19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
0×20,0×21,0×22,0×23,0×24,0×25,0×26,0×27,0×28,0×29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
0×30,0×31,0×32,0×33,0×34,0×35,0×36,0×37,0×38,0×39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
0×40,0×41,0×42,0×43,0×44,0×45,0×46,0×47,0×48,0×49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
0×50,0×51,0×52,0×53,0×54,0×55,0×56,0×57,0×58,0×59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
0×60,0×61,0×62,0×63,0×64,0×65,0×66,0×67,0×68,0×69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
0×70,0×71,0×72,0×73,0×74,0×75,0×76,0×77,0×78,0×79,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,0×95,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]={
0×00,0×01,0×02,0×03,0×04,0×05,0×06,0×07,0×08,0×09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
0×10,0×11,0×12,0×13,0×14,0×15,0×16,0×17,0×18,0×19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
0×20,0×21,0×22,0×23,0×24,0×25,0×26,0×27,0×28,0×29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
0×30,0×31,0×32,0×33,0×34,0×35,0×36,0×37,0×38,0×39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
0×40,0×41,0×42,0×43,0×44,0×45,0×46,0×47,0×48,0×49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
0×50,0×51,0×52,0×53,0×54,0×55,0×56,0×57,0×58,0×59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
0×60,0×61,0×62,0×63,0×64,0×65,0×66,0×67,0×68,0×69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
0×70,0×71,0×72,0×73,0×74,0×75,0×76,0×77,0×78,0×79,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,0×95,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,
0x5F,0x9F,0×97,0x5F,0x9D,0x5F,0x7C,0×15,0xB3,0×63,0×99,0×11,0x2D,0x2D,0×72,0×93,
0x9C,0x5F,0×49,0×69,0x5F,0x5F,0×14,0x9E,0xA3,0xBF,0×98,0×10,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 \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(argc0)
{
convert(tmpbuff,xtbl,nr);
fwrite(tmpbuff,1,nr,f2);
}
fclose(f1);
fclose(f2);
return 0;
}

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

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты