Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2010, 13:54   #1
4айник
 
Регистрация: 17.03.2010
Сообщений: 5
По умолчанию Определить кодировку

Начальное задание было написать программу на ассемблере(NASM Linux) для определения кодировки в текущей директории(кодировки KOI8 и CP866).Написал программу на С ,чтобы лучше понять как работает алгоритм на практике,а потом узнал ,что если использовать только те функции ,для которых есть системные вызовы ,то дизассемблировав код на С можно получить код на ассе.Помогите преобразовать код(те места в которых есть проблемы пометил на коде)
Код:
#include <stdio.h>
int main()
{
unsigned char simvol;
FILE *file;
int ascii_kod=0,i=0,j=0,fl_KOI8=0,fl_CP866=0,n;
unsigned char ms[100]={0};
char KOI8[14]="KOI8 kodirovka",CP866[15]="CP866 kodirovka";
char ERROR_MESSAGE[36]="fail ne soderzhit simvolov kirillicy";
clrscr();
file=fopen("e:/kodddddd.txt","rt");//хочу здесь вместо fopen  использовать open(пробовал-читалась какае-то ересь)
if(file==0)
{
printf("Ne mogu otkryt fail");
return -1;
}
while(i<100)
{
if((simvol=fgetc(file))!=EOF)//здесь хочу вместо fgetc использовать read(пробовал-read возвращал -1)
{
ascii_kod=simvol;
if((ascii_kod>=128)&&(ascii_kod<=255))
{
ms[i]=simvol;
i++;
}
}
else goto start;
}
start:
for(j=0;j<i;j++)
{
ascii_kod=ms[j];
if((ascii_kod>=192)&&(ascii_kod<=255)) fl_KOI8++;
if(((ascii_kod>=128)&&(ascii_kod<=175))||((ascii_kod>=224)&&(ascii_kod<=239))) fl_CP866++;
}
if(i==0) write(1,ERROR_MESSAGE,36);
else
{
if(fl_KOI8==i) write(1,KOI8,14);
if(fl_CP866==i) write(1,CP866,15);
}
return 1;
}
P.S.и еще один вопрос:как получить все файлы из текущей директории.(считать,что в директории кроме текстовых файлов нет ничего).

Последний раз редактировалось Stilet; 17.06.2014 в 09:27.
4айник вне форума Ответить с цитированием
Старый 17.06.2014, 08:55   #2
xeugenex
Новичок
Джуниор
 
Регистрация: 25.09.2010
Сообщений: 1
По умолчанию Вот мои способы определения кодировок KOI8R и UTF8

function IsKOI8REncodedString(S:String):Bool ean;
var
i:integer;
LU,LL:integer;
EX:String;
begin
result:=false;
S:=TRIM(S);
if S='' then exit;

EX:='АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬ ЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэю я';
LU:=1;LL:=1;

for i:=1 to length(S) do
if pos(S[i],EX)>0 then
begin
if S[i]=ansiuppercase(S[i]) then LU:=LU+1;
if S[i]=ansilowercase(S[i]) then LL:=LL+1;
end;

If (LU/LL)>1 then result:=true else Result:=false;
end;

// ------------------------------------------------------------------------

function IsUTF8EncodedString(S:String):Boole an;
begin
if s='' then result:=false else
if length(UTF8Decode(S))=0 then Result:=false else result:=true;
end;

// ------------------------------------------------------------------------

function IsBase64EncodedString(S:String):Boo lean;
var
i:integer;
EX:String;
begin
EX:=#$00+#$01+#$02+#$03+#$04+#$05+# $06+#$07+#$08+#$09+#$0A+#$0B+#$0C+# $0D+#$0E+#$0F+#$10+#$11+#$12+#$13
+#$14+#$15+#$16+#$17+#$18+#$19+#$1A +#$1B+#$1C+#$1D+#$1E+#$1F+#$20+#$21 +#$22+#$23+#$24+#$25+#$26+#$27
+#$28+#$29+#$2A+#$2C+#$2D+#$2E+#$3A +#$3B+#$3C+#$3E+#$3F+#$40+#$5B+#$5C +#$5D+#$5E+#$5F+#$60+#$7B+#$7C
+#$7D+#$7E+#$7F+#$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;

Result:=true;
s:=TRIM(ansireplacestr(ansireplaces tr(S,#13,''),#10,''));
if length(S)/2<>trunc(length(S)/2) then Result:=false else
for i:=1 to length(EX) do if pos(EX[i],S)>0 then Result:=false;
end;

Последний раз редактировалось xeugenex; 17.06.2014 в 11:00. Причина: UPD: Малость подправил и убрал лишнее. Старый вариант KOI8 работал только на больших текстах, а на мелких давал погрешности.
xeugenex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как поменять кодировку windows Silverstreet Помощь студентам 4 23.01.2010 21:40
AJAX выводит не ту кодировку mogul82 JavaScript, Ajax 2 05.01.2009 19:27
Про кодировку... Lich Работа с сетью в Delphi 5 29.12.2008 10:32
подскажите кодировку для казахстана. Sjava HTML и CSS 4 17.07.2007 15:08