Konverzija kodne stranice u C++-u (iz CP 852)

poruka: 10
|
čitano: 6.244
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
15 godina
neaktivan
offline
Pomagaj netko C++ ABZ(=ako Boga znaš)

Učim C++, više ne ide nego ide a dolazim sa VisualBasica.

 

Sada trebam učitati string iz datoteke binarno kao polje znakova.

String je nastao u DOSu, na CP 852.

Trebam ga promijeniti u string za C++, pregledati svaki znak i zamijeniti HR slova, promijenjenog upisati u drugi file.

Imam ovo:

 

            string charTO;

            string myString = ""

 

           int o;
            for(o=0;nekiString] !='\0';o++)
               {
                int a=nekiString[o];

                charTO = a;  // int to znak 

                   switch (a) // promjeni ako je HR znak
                  {
                   case 172:
                     charTO = 'Č'; // kod svakog HR slova je warning: multi-character character constant
                     break;
                   case 143:
                     charTO = 'Ć';
                     break;
                   case 230:
                     charTO = 'Š';
                     break;
                   case 209:
                     charTO = 'Đ';
                     break;
                   case 166:
                     charTO = 'Ž';
                     break;
                   case 159:
                     charTO = 'č';
                     break;
                   case 134:
                     charTO = 'ć';
                     break;
                   case 231:
                     charTO = 'š';
                     break;
                   case 208:
                     charTO = 'đ';
                     break;
                   case 167:
                     charTO = 'ž';
                     break;
                  }
               myString=myString+charTO;  // dodaj znak na string
               }
         fprintf (myFile, "%s\n", myString); //tu je greška warning: cannot pass objects of non-POD type ‘struct std::string’ through ‘...’; call will abort at runtime

                                                          //i još warning: format ‘%s’ expects type ‘char*’, but argument 3 has type ‘int’

                                                              //tu program kod izvršavanja jednostavno "pukne" bez da opiše grešku.
         }}

 

Kod kompajliranja stvar prođe s 22 upozorenja i bez greške.

Ali pukne na liniji fprintf. Radim to na Linuxu s IDE Code::Blocks.

Isto tako, iako file čitam binarno na mjestu slova 'č' charto pokaže znak "/237".

 

U čemu je tu kvaka i kako to napraviti.

 

 
0 0 hvala 0
17 godina
protjeran
offline
Konverzija kodne stranice u C++-u (iz CP 852)

Što se tiče hrvatskih znakova trebao bi koristiti nešto poput UnicodeString, što postoji u C++ Builderu ili WideString (wchar_t *) što mislim da ima i u VS-u. No svejedno ne vjerujem da će to proći upotrebom C pristupa tj. s fprintf. Mislim da je u ovom slučaju čak i nužno potrebno koristiti C++ streamove tj. (i)fstream objekte za čitanje i pisanje u datoteku jer jedino oni mogu imati preopterećenje ulaznih i izlaznih operatora (>> i <<) za rad s unicode tipovima podatka.

Moj PC  
0 0 hvala 0
15 godina
neaktivan
offline
RE: Konverzija kodne stranice u C++-u (iz CP 852)

Halo Tracer,

a čuj... ne znam (zato i pitam).

Samo znam da se to u Visual Basicu napravi za koju minuticu.

Sigurno i C++ ima načina.

 

Inače, meni ne treba puka konverzija sa cp852 kako u naslovu piše nego prerada znakova u stringu.

Pričekat ću, možda je netko već lupao glavu s tim.

USS (=u svakom slučaju) hvala na odgovoru i namjeri za pomoć.

17 godina
moderator
online
RE: Konverzija kodne stranice u C++-u (iz CP 852)
nime kaže...
Inače, meni ne treba puka konverzija sa cp852 kako u naslovu piše nego prerada znakova u stringu.

Mozda da malo bolje objasnis sto tocno tebi treba? O kakvoj "preradi" pricas?

15 godina
neaktivan
offline
RE: Konverzija kodne stranice u C++-u (iz CP 852)

Pričam o "preradi" (zašto se prarada piše u navodnicima?) hrvatskih znakova u stringu koji su nastali na cp852 a mogli su nastati i na 437, a planiram koristiti i slovensku i srpsku kodnu stranicu tako da mi ta standardizacija već zbog navedenog nije uvjet a niti mi rješava sve probleme. To dakle nije ni problem ni tema. U nekom slučaju mogao bih mijenjati char 97 za slovo "Ž". aime, mogao bih kad bih znao kako. To je tema.

Predvidio sam da se switch petlja može zamijeniti - prema potrebi.

Zar sam problem nedostatno opisao?

Tj. sad kad sam objasnio bolje ima li kakvog konkretnog rješenja da iz polja znakova (char) dobijem string s HR slovima na Linuxu ili Windowsima?

 

17 godina
protjeran
offline
Konverzija kodne stranice u C++-u (iz CP 852)

Pa u čemu je onda problem? Ne znaš kako mijenjati slova u nekom stringu?

Moj PC  
0 0 hvala 0
15 godina
neaktivan
offline
RE: Konverzija kodne stranice u C++-u (iz CP 852)

Pa u biti da, odnosno ne ili zapravo tu negdje.

Sad baš naletjeh na još jednu minu!

 

Da, Tracer, učim taj komplicirani C++ i još gore radim na linuxu trenutno.

I gle sad ovo:

Slovo "Č" u cp852 ima kod 172.

U Windovsima napravim ovo: If letter = 172 then letter = "Č". I to funkcionira.

 

Ali (sad tek vidim) za ova naša slova linux daje negativni kod i njemu je "Č" -97???

Naime, u datoteci jedt kod 172 a on ga pročita kao -97. Ludilo.

Čitam ovako:

 

          fseek(f,(len_inv_record*(i-1)),SEEK_SET);
          fread(&invli,len_inv_record,1,f);

 

I pročita on to sve, samo naša slova izmulja na svoj način.

Znaš li što o tome?

 

 

 

17 godina
protjeran
offline
RE: Konverzija kodne stranice u C++-u (iz CP 852)

To su specifičnosti vezane za rad s različitim jezicima. Iskreno, nikada to nisam baš pokušavao pod linuxom, no našao sam nešto:

 

Starting with GNU glibc 2.2, the type wchar_t is officially intended to be used only for 32-bit ISO 10646 values, independent of the currently used locale. This is signalled to applications by the definition of the __STDC_ISO_10646__ macro as required by ISO C99. The ISO C multi-byte conversion functions (mbsrtowcs(), wcsrtombs(), etc.) are fully implemented in glibc 2.2 or higher and can be used to convert between wchar_t and any locale-dependent multibyte encoding, including UTF-8, ISO 8859-1, etc.

For example, you can write

  #include <stdio.h>
  #include <locale.h>

  int main()
  {
    if (!setlocale(LC_CTYPE, "")) {
      fprintf(stderr, "Can't set the specified locale! "
              "Check LANG, LC_CTYPE, LC_ALL.\n");
      return 1;
    }
    printf("%ls\n", L"Schöne Grüße");
    return 0;
  }

Call this program with the locale setting LANG=de_DE and the output will be in ISO 8859-1. Call it with LANG=de_DE.UTF-8 and the output will be in UTF-8. The %ls format specifier in printf calls wcsrtombs in order to convert the wide character argument string into the locale-dependent multi-byte encoding.

 

Detaljnije pogledaj primjere ovdje:

 

http://www.cl.cam.ac.uk/~mgk25/unicode.html

15 godina
neaktivan
offline
RE: Konverzija kodne stranice u C++-u (iz CP 852)

Da, to bi valjalo proučiti.

No ja sad ipak malo važem stvari i dolazim do toga da se trebam vratiti na početak i napisati osobne konverzijske tablice koje bi program uključivao po nekom setupu. Mislim da bi to bilo za moj slučaj bolje rješenje iz prije navedenih razloga.

 

Nego, bi li mi mogao pomoći oko toga?

Npr. zašto mi linija s fprintf javlja grešku?

Ili kako da dodam znak "Č" na myString?

17 godina
moderator
online
RE: Konverzija kodne stranice u C++-u (iz CP 852)
nime kaže...

Pričam o "preradi" (zašto se prarada piše u navodnicima?) hrvatskih znakova u stringu koji su nastali na cp852 a mogli su nastati i na 437, a planiram koristiti i slovensku i srpsku kodnu stranicu tako da mi ta standardizacija već zbog navedenog nije uvjet a niti mi rješava sve probleme. To dakle nije ni problem ni tema. U nekom slučaju mogao bih mijenjati char 97 za slovo "Ž". aime, mogao bih kad bih znao kako. To je tema.

Pravis se pametan, a da za to zaista nemas razloga. U svakom slucaju mijenjas tekst iz jedne kodne stranice u drugu - radis PUKU KONVERZIJU iz cp852 - upravo ono sto tvrdis da ne radis. Koja je sad razlika koristiti drugu kodnu stranicu? Ili vlastitu kodnu stranicu? Ne razumijes pojam kodna stranica. Princip je isti, samo sto za razlicite kodne stranice moras imati razlicite matrice (ili dva vektora umjesto matrice s dva stupca) sa znakovima koje ces zamijeniti drugim znakovima.

 

nime kaže...
Predvidio sam da se switch petlja može zamijeniti - prema potrebi.

Kao prvo switch nije petlja. Kao drugo, switch ne da treba zamijeniti prema potrebi, nego ga treba u potpunosti izbaciti. Trebas samo imati matricu za konverziju i s for petljom proci kroz tu matricu. Neces valjda pedeset znakova mijenjati tako da ides pisati switch s pedeset slucajeva!

 

nime kaže...
Zar sam problem nedostatno opisao?

Uzrokovao si zbunjolu tvrdeci da ne radis puku konverziju, kad upravo to radis.

 

nime kaže...

Tj. sad kad sam objasnio bolje ima li kakvog konkretnog rješenja da iz polja znakova (char) dobijem string s HR slovima na Linuxu ili Windowsima?

Zasto si prvo umjesto u datoteku pomocu fprintf konvertirane stringove jednostavno ne ispises na ekran pomocu cout << da vidis jel ti program uopce radi? Pa da tek onda ides rjesavat problem zapisivanja u datoteku?

 

Dalje - ne znam dovoljno o Linuxu - jel kod koji si tu napisao, znaci ovi hrvatski dijakriticki znakovi  (Č, č, Ž, ž...), oni su u izvornom kodu napisani kao osam bitni znakovi, ili kao Unicode ili neka druga 16-bitna kodna stranica? Naime, poruka "warning: multi-character character constant" sugerira da ti konstatna 'Č' nije samo jedan znak (8 bitova), nego više - vjerojatno dva znaka, odnosno 16 bitova. To je nešto o čemu valja razmisliti (kojim kodom ce ti Č, č, Ž, ž... biti predstavljeni, ovisi o tome koja ti je kodna stranica postavljena u editoru izvornog koda!) - ne mijesas li u konačnici 8-bitne (nepromijenjena, originalna slova iz datoteke) i 16-bitne znakove!?

 

Uzmi ovaj kod pa pocni od njega:

    string charTO;
    string myString = ""; 
   
    const int brojZnakova = 5;   
   
    int matricaFrom[brojZnakova] = {65 /* slovo A */, 'Æ', 'Š', 'š', 'D'};
    int matricaTo[brojZnakova] = {'x', 'C', 'S', 's', 'd'};
   
    for(int o = 0; o < nekiString.length(); o++)
       {
            unsigned char a = nekiString[o];
            charTO = a;
           
            for (int i = 0; i < brojZnakova; i++) {
                if (a == matricaFrom[i]) {
                    charTO = matricaTo[i];
                    break;
                }
            }
           
            myString = myString + charTO;
       }              

    cout << myString << endl;

Kad ti to ispravno profunkcionira, onda se idi bavi fprintf funkcijom... Ili je zamijeni nekom drugom.

 

nime kaže...
Ali (sad tek vidim) za ova naša slova linux daje negativni kod i njemu je "Č" -97???

Naime, u datoteci jedt kod 172 a on ga pročita kao -97. Ludilo.

Čitam ovako:

 

          fseek(f,(len_inv_record*(i-1)),SEEK_SET);
          fread(&invli,len_inv_record,1,f);

 

I pročita on to sve, samo naša slova izmulja na svoj način.

Znaš li što o tome?

Sigurno ga ne pročita kao -97. Negdje si nesto zeznuo. Vjerojatno kod definiranja tipova. Ako koristis 8-bitne znakove, onda za tip koristi unsigned char, a ne char ili int. Ako koristis 16 ili vise-bitne znakove, onda koristi unsigned int.

Poruka je uređivana zadnji put pon 29.3.2010 23:16 (mbaksa).
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice