Jak zmusic C++ Buildera aby pokazal mi jakie jest kodowanie polskich znakow w otwieranym pliku txt ? [???]
Przeanalizowalem sobie kod ktory zostal mi zapodany i chcialme go wy<ort>kozystac</ort> do swoich potrzeb ale cos chyba skopalem poniewaz jesl idobrze zrzumialme to programik mial zliczac ilosc wystepowania danego znaku w tekscie czyli przeanalizowac caly tekst a pozniej porownac z tablica w ktorej sa dane odnosnie kodowania.
Dziabnolem sobie cos w tym stylu :
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int st[2][18]=
{/*iso-8859-2*/ {175,172,166,211,209,163,202,198,161,191,188,182,243,241,179,234,230,177},
/*cp1250*/ {175,143,140,211,209,163,202,198,165,191,159,156,243,241,179,234,230,185}};
M2->Clear();
M3->Clear();
//---------------------- Statystyka pliku --------------------------------------
int iloscZnakow[256];
memset(iloscZnakow,0,256*4);
TFileStream *file = new TFileStream(OD->FileName,fmOpenRead+fmShareDenyNone);
char* buf = new char[1024*1024];
int k;
while ((k=file->Read(buf,1024*1024))!=0) {for (int i=0;i<k;iloscZnakow[buf[i++]]++); }
file->Free();
for(int i=0;i<256;i++)
{
M2->Lines->Add(IntToStr(i)+" <---> "+IntToStr(iloscZnakow[i]));
}
//---------------------------Suma kodu -------------------------------------
int iso=0,cp=0;
for(int i=0;i<18;i++)
{
iso=iso+iloscZnakow[st[0][i]];
cp=cp+iloscZnakow[st[1][i]];
}
M3->Lines->Add("System plikow :");
M3->Lines->Add(iso);
M3->Lines->Add(cp);
}
W moim przykladzie tablica st jest wy<ort>kozystywana</ort> do podawania indeksu ktory ma byc wy<ort>kozystwany</ort> w dodawaniu tablicy ilosZnakow. niby wszystko dziala ale jak sprawdzam sobie czy to dziala to dostaje jakies wartosci sciagnelem sobie inny program ktory koduje w roznych systemch i po zakodowaniu do iso-8859-2 w tym programiku u mnie nie wykrywa go jako iso. Jak sprobuje wykryc kodowanie tamtym programikiem to napisze ze jest to iso. Czy tkos mi powie co zle kombinuje ?
Odpal bcb wybierz file->new->console wizard->console->finish. Wklej to co masz poniżej i odpal....
#include <stdio.h>
#include <stdlib.h>
int main(){
int i=char(175); // pierwszy znak w obu tablicach
printf("%d\n",i);
system("pause > nul");
return 0;
}
Obejrzyj wynik, obejrzyj sobie jeszcze raz dokładnie to co wrzuciłem do faq. Nie, za słabo, jeszcze dokładniej. Zwróć szczególną uwagę na linijkę:
typedef unsigned char uchar; // iniezależnic sie od ustawien kompilatora. zawsze unsigned char
oraz na:
uchar buf[1024];
i w końcu na:
long znaki[256];
I sam sie klepnij w czoło... Mocno :]
// [diabel] tkwi w szczegółach i bsd