Alaska Xbase++

Alaska Xbase++
Programiranje u Xbase++

07. 08. 2019.

Xbase++ i Unicode Fontovi

UNICODE


Unicode convert
in
Serbian Cyrilic + Serbian Latin
Alaska Xbase++




Alaska Xbase++ verzija 1.9 i 2.0 nemaju ugrađenu podršku za unicode UTF8 ali se ta podrška može isprogramirati na nivou koji je u većini slučajeva zadovoljavajući – tako što se unicode UTF8 karakteri prevedu na Serbian Latin code page 238/1250 i Serbian Cyrilic code page 204/1251. Ovde je prikazan način i izvorni kod za takvu vrstu podrške.
25.07.2019












Iz lične karte u Srbiji se podaci dobijaju u unicode UTF8 kodu u kome su tamo zapisani. Neki podaci su u ličnu kartu zapisani UTF8 latinicom a neki UTF8 ćirilicom. Kada se učitaju u Alaska Xbase++ program (koji ne podržava UNICODE UTF8 kodiranje), dolazi do sledeće situacije:


(1)

     ako je windows podešen na Serbian Latin code page 238/1250
     tada je UTF8 latinica čitljiva osim slova ŠĐČĆŽšđčćž, vidi sliku SLIKA 1
     tada je UTF8 ćirilica nečitka, vidi sliku SLIKA 1
    
     U slučaju da se radi sa UTF8 znacima i slovima koji nisu konvertovani u ANSI kod pa ih
     Alaska Xbase++ ne podržava, ti znaci su čitljivi u txt fajlu iz editora teksta na
     način:
    
     Da bi UTF8 ćirilica bila čitljiva kada se tekst prebaci u txt fajl pa se txt fajl čita  
     iz nekog od editora koji podržava UTF8 mora se u prvu liniju txt fajla upisati UTF8
     BOM signature odnosno kod: ? Chr(0xEF) + Chr(0xBB) + Chr( 0xBF ). vidi sliku SLIKA 2
    
     U slučaju kada se radi sa UTF8 znacima i slovima koji se konvertuju u ANSI kod pa ih  
     kao takve Alaska Xbase++ podržava, prikazuje ih kao čitljive, radi se sledeće:
    
     Da bi UTF8 latinica bila kompletno čitljiva iz aplikacije u prikazu na ekranu monitora
     moraju se ti stringovi prevesti sa UTF8 koda na ANSI kod Serbian Latin 238/1250
    
     Da bi UTF8 ćirilica bila čitljiva iz aplikacije u prikazu na ekranu monitora moraju se
     ti stringovi prevesti sa UTF8 koda na ANSI kod Serbian Cyrilic 204/1251

     Da bi UTF8 ćirilica bila čitljiva iz aplikacije u prikazu na ekranu monitora moraju se
     ti stringovi štampati sa fontom koji je setovan na codepage 204:

    da bi se videla ćirilica setovati font objekta na codepage 204
    CYRILIC SERBIAN (font object)
    -------------------------------------------
    oFontc := XbpFont():new()
    oFontc:familyName := 'Arial'
    oFontc:nominalPointSize := 12
    oFontc:bold  := .t.
    oFontc:italic := .f.
    oFontc:underScore := .f.
    oFontc:codePage := 204 // CodePage Serbian cyrilic=204/1251
    oFontc:create() // Ć I R I L I C A

ili ako u aplikaciji nije potrebno mešati ćirilicu i latinicu, Treba sve stringove ANSI Serbian Cyrilic prevesti u ANSI Serbian Latin tako da ceo tekst ili sve string varijable budu ANSI Serbian Latin 238/1250, vidi sliku SLIKA 3

 

(2)

     ako je windows podešen na Serbian Cyrilic code page 204/1251
     tada je UTF8 latinica nečitka
     tada je UTF8 ćirilica čitljiva
    
     U slučaju da se radi sa UTF8 znacima i slovima koji nisu konvertovani u ANSI kod pa ih
     Alaska Xbase++ ne podržava, ti znaci su čitljivi u txt fajlu iz editora teksta na
     način:

     Da bi UTF8 latinica bila čitljiva kada se tekst prebaci u txt fajl pa se txt fajl čita
     iz nekog od editora koji podržava UTF8 mora se u prvu liniju txt fajla upisati UTF8
     BOM signature odnosno kod: ? Chr(0xEF) + Chr(0xBB) + Chr( 0xBF )
    
     U slučaju kada se radi sa UTF8 znacima i slovima koji se konvertuju u ANSI kod pa ih  
     kao takve Alaska Xbase++ podržava, prikazuje ih kao čitljive, radi se sledeće:

     Da bi UTF8 latinica bila kompletno čitljiva iz aplikacije u prikazu na ekranu monitora
     moraju se ti stringovi prevesti sa UTF8 koda na ANSI kod Serbian Latin 238/1250
    
     Da bi UTF8 ćirilica bila čitljiva iz aplikacije u prikazu na ekranu monitora moraju se
     ti stringovi prevesti sa UTF8 koda na ANSI kod Serbian Cyrilic 204/1251

     Da bi UTF8 latinica bila čitljiva iz aplikacije u prikazu na ekranu monitora moraju se
     ti stringovi štampati sa fontom koji je setovan na codepage 238:

    da bi se videla latinica setovati font objekta na codepage 238
    LATIN SERBIAN (font object)
    -------------------------------------------
    oFontl := XbpFont():new()
    oFontl:familyName := 'Arial'
    oFontl:nominalPointSize := 12
    oFontl:bold  := .t.
    oFontl:italic := .f.
    oFontl:underScore := .f.
    oFontl:codePage := 238 // CodePage Serbian latin=238/1250
    oFontl:create() // L A T I N I C A


ili ako u aplikaciji nije potrebno mešati ćirilicu i latinicu, treba sve stringove ANSI Serbian Latin prevesti u ANSI Serbian Cyrilic tako da ceo tekst ili sve string varijable budu ANSI Serbian Cyrilic 204/1251


Za ovo prevođenje koriste se funkcije iz modula COM_1251.PRG

FUNCTION Latin1250_TO_Cyrilic1251(cString_1250) - latinica u ćirilicu

FUNCTION Cyrilic1251_TO_Latin1250(cString_1251) - ćirilica u latinicu

FUNCTION UTF8_TO_Cyrilic1251_Latin1250(cString_UTF8) - UTF8 u ćirilicu-latinicu



 SLIKA 1

Tekstualni izveštaj dobijen čitanjem lične karte sa unicode UTF8 kodom ima sledeći prikaz txt fajla u editoru:

 ***


Windows je podešen na Serbian Latin 238/1250
Tekst – odnosno stringovi (varijable) su preuzeti iz lične karte u UTF8 kodu i tako su poslati u txt fajl. Ovde je ćirilica nečitka (Prezime, Ime) a kod latinice su nečitka slova ŠĐČĆŽšđčćž (Mesto rođenja – Ž, Opština rođenja – Ž, Ulica – Ć)





 SLIKA 2

Tekstualni izveštaj dobijen čitanjem lične karte sa unicode UTF8 kodom i sa UTF8 BOM SIGNATUROM u tekst fajlu ima prikaz txt fajla u editoru:

 ***


Windows je podešen na Serbian Latin 238/1250
Tekst – odnosno stringovi (varijable) su preuzeti iz lične karte u UTF8 kodu i tako su poslati u txt fajl. U prvi red tekst fajla upisan je kod za UTF8 BOM SIGNATURU:
? Chr(0xEF) + Chr(0xBB) + Chr( 0xBF ).
Ovde se u istom tekstu može dobiti i latinica i ćirilica

Note: Nazivi podataka, na primer Država, Opština... kodirani su u izvornom kodu u Serbian Latin code page 238/1250 a ne u UTF8, pa kada se tekst fajl čita kao da je kodiran u UTF8 (jer ima UTF8 BOM SIGNATURU) tada su nečitki znaci ŠĐČĆŽšđčćž jer nisu sa ANSI Serbian Latin koda prevedeni u UTF8 kod, dok ostali znaci imaju i u Serbian Latin i u UTF8 isti kod pa su stoga ispravno pročitani kao UTF8. 



 SLIKA 3

Tekstualni izveštaj sa unicode ANSI Serbian Latin kodom dobijenim prevođenjem iz UTF8 u Serbian Latin i Serbian Cyrilic, a zatim prevođenjem Serbian Cyrilic u Serbian latin, ima prikaz txt fajla u editoru:

 ***


Windows je podešen na Serbian Latin 238/1250
Tekst – odnosno stringovi (varijable) su preuzeti iz lične karte u UTF8 kodu i prevedeni su u Serbian Latin i Serbian Cyrilic, pa iz Serbian Cyrilic u Serbian Latin, i posle toga su poslati u txt fajl. Ovde nema ćirilice, već postoji samo Serbian Latin - latinica koja je čitka.




UNICODE TEKST U XBASE++

Kod čitanja lične karte LK tekst varijable koje se dobijaju sadrže unicode tekst UTF8 koji alaska xbase++ ne može da interpretira bez prevođenja na ANSI format kada su u pitanju posebna slova za Serbian Latin (code page 238/1250) i kada su u pitanju sva slova za Serbian Cyrilic (code page 204/1251)

Program ove LK tekst varijable snima u ASCII tekst fajl koji se odmah posle toga otvara za pregled teksta iz editora notepad2.exe

Ta slova se, ako je Serbian Latin (latinica) u tekst editorima (notepad2) vide kao nečitljivi znakovi (vidi sliku: Tekstualni izveštaj ima sadržaj – Nazivi za: Mesto rođenja i Ulica)

Ta slova se,  ako je Serbian Cyrilic (ćirilica), u tekst editorima (notepad2) vidi kao nečitljivi skup znakova Đ i drugih (vidi sliku: Tekstualni izveštaj ima sadržaj – Prezime i Ime)

(1)

Ako hoćete da se u tekst fajlu učitanom u editor ispravno (čitljivo) prikazuje unicode UTF8 tekst, tada tekst fajl mora da počne sa UTF8 BOM signaturom kako bi editor znao da mora da prikaže UTF8 tekst

U tom slučaju u kod programa citanje_licne_karte_2.PRG treba ubaciti blok koda - ovde označena sa UNICODE-BOM

******************************************************************* UNICODE-BOM START
ctxt := "C:\Windows\t.txt"
DELETE FILE (ctxt)
SET PRINTER TO (ctxt)
SET PRINT ON
SET CONSOLE OFF

// UTF8 BOM signature
? Chr(0xEF) + Chr(0xBB) + Chr( 0xBF )
// UTF8 BOM signature at the begining of the file
// mora biti u prvom redu text fajla da bi ga editor prihvatio
// a set printer to (ctxt) ostavlja prvi red prazan pa ga na kraju
// ovog programa treba obrisati !
*******************************************************************
SET MARGIN TO 2

 ? " "
 ? "DOKUMENT LIČNA KARTA"
 ? cCardVersion
 ? " "
 ? "Broj lične karte                    " +   aDeo1[1]  // docRegNo
 ? "Tip lične karte                     " +   aDeo1[3]  // documentType
 ? "Datum izdavanja lične karte         " +   aDeo1[5]  // issuingDate
 ? "Datum prestanka lične karte         " +   aDeo1[7]  // expiryDate
 ? "Organ izdavanja lične karte         " +   aDeo1[9]  // issuingAuthority
 ? " "
 ? " "
 ? "NEPROMENLJIVI LIČNI PODACI"
 ? " "
 ? "Matični broj JMBG                   " +   aDeo2[1]  // personalNumber
 ? "Prezime                             " +   aDeo2[3]  // surname
 ? "Ime                                 " +   aDeo2[5]  // givenName
 ? "Ime roditelja                       " +   aDeo2[7]  // parentGivenName
 ? "Pol                                 " +   aDeo2[9]  // sex
 ? "Mesto rođenja                       " +   aDeo2[11] // placeOfBirth
 ? "Država rođenja                      " +   aDeo2[13] // stateOfBirth
 ? "Datum rođenja                       " +   aDeo2[15] // dateOfBirth
 ? "Opština rođenja                     " +   aDeo2[17] // communityOfBirth
 ? " "
 ? " "
 ? "PROMENLJIVI LIČNI PODACI"
 ? "PRIJAVA PREBIVALIŠTA:"
 ? " "
 ? "Država         " + aDeo3[1]    // state
 ? "Opština        " + aDeo3[3]    // community
 ? "Mesto          " + aDeo3[5]    // place
 ? "Ulica          " + aDeo3[7]    // street
 ? "Kućni broj     " + aDeo3[9]    // houseNumber
 ? "Kućno slovo    " + aDeo3[11]   // houseLetter
 ? "Ulaz           " + aDeo3[13]   // entrance
 ? "Sprat          " + aDeo3[15]   // floor
 ? "Stan broj      " + aDeo3[17]   // apartmentNumber
 ? "Adresa podatak " + aDeo3[19]   // addressDate
 ? "Adresa labela  " + aDeo3[21]   // addressLabel
 ? " "
 ? " "
 ? "SERTIFIKAT ZA ELEKTRONSKI POTPIS:"
 IF at("Nova",cCardVersion)>0
   ? cCardVersion
   ? "nema mogućnost čitanja sertifikata"
 ELSE
   ? cCardVersion
   IF EMPTY(aDeo5[1])
   ? "Lična karta nema sertifikat"
   ELSE
   ? aDeo5[1]
   ENDIF
 ENDIF
 ? " "
 ? " "

SET PRINTER TO
SET PRINT OFF
SET CONSOLE ON
SET MARGIN TO 0

*******************************************************************
// UTF8 BOM signature
// Brisanje prvog praznog reda u fajlu cTxt
// kako bi drugi red sa UTF8 BOM sada postao prvi red
// vTxt := tekst preuzet iz fajla cTxt u string vTxt
vTxt := alltrim( MEMOREAD(cTxt) )
// nTxt := broj karaktera stringa
nTxt := LEN(vTxt)
// mTxt = pozicija na kojoj počinje UTF8 BOM
mTxt := AT( Chr(0xEF) + Chr(0xBB) + Chr( 0xBF ), vTxt )
// oTxt := odseci početak stringa sve do početka UTF8 BOM
//         pa sada korigovani string počinje sa UTF8 BOM
oTxt := SUBSTR(vTxt,mTxt,nTxt)
// snimi korigovan string oTxt u fajl cTxt
// pa če fajl cTxt počinjati sa UTF8 BOM signaturom
MEMOWRIT(cTxt,oTxt)
******************************************************************* UNICODE-BOM END


Posle ovoga dobija se sledeći unicode tekstualni izveštaj:



U editoru Notepad2.exe sada su ispravno prikazani unicode fontovi za ćirilicu: Prezime, Ime, Mesto rođenja, Ulica. Ali latinični fontovi ŠĐČĆŽ i šđčćž koji su u program upisani kao ANSI character set a ne kao unicode, sada su nečitki. Da bi bili u ovoj konstelaciji čitki trebalo ih je u program upisati kao unicode fontove.

Ovim nije promenjen sadržaj LK tekst varijabli koje su učitane iz lične karte. I dalje je sadržaj ovih varijabli u unicode fontovima, pa će takav biti snimljen i u DBF fajl.

Treba voditi računa o tome, da ako LK tekst varijabla ima 4 znaka, na primer „ČAŠA“, polje u DBF mora imati 8 znakova (duplo) kako bi prihvatilo tekst „ČAŠA“ u unicode formatu.


Ako se LK tekst varijable koriste da bi se njihov sadržaj prikazao na ekranu monitora u xbase++ aplikaciji, moraju se konvertovati u ANSI



(2)

Ako hoćete da se u Alaska Xbase++ aplikaciji (koja nema podršku za unicode) na ekranu monitora i u ispisima slova u korisničkom interfejsu ispravno (čitljivo) prikazuje unicode UTF8 tekst, tada taj unicode tekst treba prevesti na ANSI tekst ćirilicu ili latinicu

U tom slučaju u kod programa citanje_licne_karte_2.PRG treba ubaciti blok koda - ovde označena sa UNICODE-CONVERZIJA


***************************************************** UNICODE CONVERZIJA - START
* (ima konverzije UTF8 u ANSI latinicu i ćirilicu)

ctxt := "C:\Windows\t.txt"
DELETE FILE (ctxt)
SET PRINTER TO (ctxt)
SET PRINT ON
SET CONSOLE OFF


// KONVERZIJA UTF8 U ĆIRILICU
//------------------------------------------------------
  CYR_PREZIME := UTF8_TO_Cyrilic1251_Latin1250(aDeo2[3])  // surname
  CYR_IME     := UTF8_TO_Cyrilic1251_Latin1250(aDeo2[5])  // givenName


// KONVERZIJA ĆIRILICE U LATINICU
// da se ne bi kod prikaza i štampe menjala kodna strana
// iz default latinice 238/1250 u ćirilicu 204/1251
//------------------------------------------------------
  LAT_PREZIME := Cyrilic1251_TO_Latin1250(CYR_PREZIME)
  LAT_IME     := Cyrilic1251_TO_Latin1250(CYR_IME)


// KONVERZIJA UTF8 U LATINICU
// kako bi se ispravno prikazali ŠĐČĆŽšđčćž
//------------------------------------------------------


     LAT_BROLK :=  UTF8_TO_Cyrilic1251_Latin1250(aDeo1[1])  // string sa ciframa
     LAT_TIPLK :=  UTF8_TO_Cyrilic1251_Latin1250(aDeo1[3])  // string
     LAT_DATLK :=  UTF8_TO_Cyrilic1251_Latin1250(aDeo1[5])  // date
     LAT_PRELK :=  UTF8_TO_Cyrilic1251_Latin1250(aDeo1[7])  // date

     LAT_ORGLK :=  UTF8_TO_Cyrilic1251_Latin1250(aDeo1[9])

  LAT_IMEOCA  := UTF8_TO_Cyrilic1251_Latin1250(aDeo2[7])
  LAT_MESTOR  := UTF8_TO_Cyrilic1251_Latin1250(aDeo2[11])

  LAT_DRZAVAR := UTF8_TO_Cyrilic1251_Latin1250(aDeo2[13])
  LAT_OPSTINR := UTF8_TO_Cyrilic1251_Latin1250(aDeo2[17])


  LAT_DRZAVA := UTF8_TO_Cyrilic1251_Latin1250(aDeo3[1])
  LAT_OPSTIN := UTF8_TO_Cyrilic1251_Latin1250(aDeo3[3])
  LAT_MESTO  := UTF8_TO_Cyrilic1251_Latin1250(aDeo3[5])



  LAT_ULICA  := UTF8_TO_Cyrilic1251_Latin1250(aDeo3[7])
  LAT_ADRES1 := UTF8_TO_Cyrilic1251_Latin1250(aDeo3[19])
  LAT_ADRES2 := UTF8_TO_Cyrilic1251_Latin1250(aDeo3[21])


SET MARGIN TO 2

 ? " "
 ? "DOKUMENT LIČNA KARTA"
 ? cCardVersion
 ? " "
 ? "Broj lične karte                    " +  LAT_BROLK //  aDeo1[1]  // docRegNo
 ? "Tip lične karte                     " +  LAT_TIPLK //  aDeo1[3]  // documentType
 ? "Datum izdavanja lične karte         " +  LAT_DATLK //  aDeo1[5]  // issuingDate
 ? "Datum prestanka lične karte         " +  LAT_PRELK //  aDeo1[7]  // expiryDate
 ? "Organ izdavanja lične karte         " +  LAT_ORGLK //  aDeo1[9]  // issuingAuthority
 ? " "
 ? " "
 ? "NEPROMENLJIVI LIČNI PODACI"
 ? " "
 ? "Matični broj JMBG                   " +   aDeo2[1]     // personalNumber
 ? "Prezime                             " +   LAT_PREZIME  // aDeo2[3]  // surname
 ? "Ime                                 " +   LAT_IME      // aDeo2[5]  // givenName
 ? "Ime roditelja                       " +   LAT_IMEOCA   // aDeo2[7]  // parentGivenName
 ? "Pol                                 " +   aDeo2[9]     // sex
 ? "Mesto rođenja                       " +   LAT_MESTOR   // aDeo2[11] // placeOfBirth
 ? "Država rođenja                      " +   LAT_DRZAVAR  // aDeo2[13] // stateOfBirth
 ? "Datum rođenja                       " +   aDeo2[15]    // dateOfBirth
 ? "Opština rođenja                     " +   LAT_OPSTINR  // aDeo2[17] // communityOfBirth
 ? " "
 ? " "
 ? "PROMENLJIVI LIČNI PODACI"
 ? "PRIJAVA PREBIVALIŠTA:"
 ? " "
 ? "Država         " + LAT_DRZAVA  // aDeo3[1]    // state
 ? "Opština        " + LAT_OPSTIN  // aDeo3[3]    // community
 ? "Mesto          " + LAT_MESTO   // aDeo3[5]    // place
 ? "Ulica          " + LAT_ULICA   // aDeo3[7]    // street
 ? "Kućni broj     " + aDeo3[9]    // houseNumber
 ? "Kućno slovo    " + aDeo3[11]   // houseLetter
 ? "Ulaz           " + aDeo3[13]   // entrance
 ? "Sprat          " + aDeo3[15]   // floor
 ? "Stan broj      " + aDeo3[17]   // apartmentNumber
 ? "Adresa podatak " + LAT_ADRES1  // aDeo3[19]   // addressDate
 ? "Adresa labela  " + LAT_ADRES2  // aDeo3[21]   // addressLabel
 ? " "
 ? " "
 ? "SERTIFIKAT ZA ELEKTRONSKI POTPIS:"
 IF at("Nova",cCardVersion)>0
   ? cCardVersion
   ? "nema mogućnost čitanja sertifikata"
 ELSE
   ? cCardVersion
   IF EMPTY(aDeo5[1])
   ? "Lična karta nema sertifikat"
   ELSE
   ? aDeo5[1]
   ENDIF
 ENDIF
 ? " "
 ? " "

SET PRINTER TO
SET PRINT OFF
SET CONSOLE ON
SET MARGIN TO 0

******************************************************** UNICODE CONVERZIJA – END



IZVORNI KOD PROGRAMA SA FUNKCIJAMA ZA PREVOĐENJE ĆIRILICE U LATINICU I OBRNUTO I UNICODE UTF8 U ĆIRILICU I LATINICU I OBRNUTO

/*

 COM_1251.PRG

 14-07-2019

 © COBA Systems Software
 BAST® Open Source Project
 Business Account Software Technology
 www.cobasystems.com
 Program: Alaska Xbase++ 1.90.355 sl1
          XbTools, ADSDBE, eXpress++


 KONVERZIJA LATINICE 238/1250 U ĆIRILICU 204/1251
 KONVERZIJA ĆIRILICE 204/1251 U LATINICU 238/1250
 ISTOVREMENI PRIKAZ LATINICE I ĆIRILICE NA EKRANU APLIKACIJE

 prerađen i popravljen program com_1251 iz 2004 godine

*/



#include "Appevent.ch"
#include "Xbp.ch"
#include "Gra.ch"
#include "Font.ch"
#include "color.ch"
#include "common.ch"

#include "xbtsys.ch"
#include "dcdialog.ch"
#include "dcgra.ch"


* TEST FUNKCIJA
*************************************************************************
FUNCTION test_cirilica()
*************************************************************************
LOCAL cString_ASCIII_latin := "",;
      cString_ASCIII_cyril := "",;
      xcirilica := "",;
      xlatinica := ""

* Prevođenje stringa latinice u string ćirilice
*----------------------------------------------
// kodirani ASCIII string Serbian Latin 238/1250
// upisan u program preko latinične tastature - Serbian Latin
 cString_ASCIII_latin := "ŠĐČĆŽ šđčćž QWXY qwxy coba COBA"

// taj string latinice preveden na string ćirilicu 204/1251:
 **************************************************************
 xcirilica   :=  Latin1250_TO_Cyrilic1251(cString_ASCIII_latin)
 **************************************************************


* Prevođenje stringa ćirilice u string latinice
*----------------------------------------------

// kodirani ASCIII string Serbian Cyrilic 204/1251
// upisan u program preko ćirilične tastature - Serbian Cyrilic
 cString_ASCIII_cyril := "Ř€×ŽĆ ř÷žćöîáŕ ÖÎÁŔ"

// ili preizeti string ćirilice iz varijable dobijene prevođenjem
// stringa latinice u string ćirilice
* cString_ASCIII_cyril := xcirilica

// string ćirilica 204/1251 preveden na string latinicu 238/1250
 ***************************************************************
 xlatinica   :=  Cyrilic1251_TO_Latin1250(cString_ASCIII_cyril)
 ***************************************************************


// Način istovremenog prikazivanja i ćirilice i latinice u Xbase++
 test_cirilica_vidi(cString_ASCIII_latin, xcirilica,;
                    cString_ASCIII_cyril, xlatinica)

RETURN NIL


* TEST FUNKCIJA
*************************************************************************
FUNCTION test_cirilica_vidi(cString_ASCIII_latin, cirilica,;
                            cString_ASCIII_cyril, latinica)
*************************************************************************
// Način istovremenog prikazivanja i ćirilice i latinice u Xbase++

LOCAL GetList := {}, GetOptions, oDlg , oTxtl, oTxtc, oTxtcc

* ovo je po defaultu za setup windowsa na Serbian Latin pa se
* tada ne mora (kao ovde) setovati font na codepage 238
* "LATIN SERBIAN (font object)
*--------------------------------
oFontl := XbpFont():new()
oFontl:familyName := 'Arial'
oFontl:nominalPointSize := 12
oFontl:bold := .t.
//oFontl:italic := .t.
//oFontl:underScore := .t.
oFontl:codePage := 238 // CodePage Serbian cyrilic=238/1250
oFontl:create()// L A T I N I C A


* da bi se videla ćirilica mora se setovati Cyrilic font objekta
* na codepage 204
* "CYRILIC SERBIAN (font object)
*--------------------------------
oFontc := XbpFont():new()
oFontc:familyName := 'Arial'
oFontc:nominalPointSize := 12
oFontc:bold := .t.
//oFontc:italic := .t.
//oFontc:underScore := .t.
oFontc:codePage := 204 // CodePage Serbian cyrilic=204/1251
oFontc:create() // Ć I R I L I C A

@ 2,2 DCSAY "LATINICA ILI UTF8 PREVEDENA U ĆIRILICU" SAYSIZE 0

@ 4,2 DCSAY  cString_ASCIII_latin   SAYSIZE 50 OBJECT oTxto
@ 6,2 DCSAY  cirilica               SAYSIZE 50 OBJECT oTxtc


@ 10,2 DCSAY "ĆIRILICA ILI UTF8 PREVEDENA U LATINICU" SAYSIZE 0 SAYCOLOR GRA_CLR_DARKRED

@ 12,2 DCSAY  cString_ASCIII_cyril  SAYSIZE 50 OBJECT oTxtx   SAYCOLOR GRA_CLR_DARKRED
@ 14,2 DCSAY  latinica              SAYSIZE 50 OBJECT oTxtl   SAYCOLOR GRA_CLR_DARKRED

@ 15,2 DCSAY " "

DCGETOPTIONS ICON 1

DCREAD GUI OPTIONS GetOptions TITLE "LATINICA - ĆIRILICA - LATINICA" ;
   FIT ;
   PARENT @oDlg ;
   EVAL {|o| SetAppWindow(o), ;
   oTxto:setfont(oFontl), ;
   oTxtc:setfont(oFontc), ;
   oTxtx:setfont(oFontc), ;
   oTxtl:setfont(oFontl) } ;
   MODAL

RETURN NIL








*"======================"
*"FUNKCIJE ZA BIBLIOTEKU
*"======================"
* RADNA FUNKCIJA KOJA SE POZIVA IZ APLIKACIJE
******************************************************************* LATINICA U ĆIRILICU
FUNCTION Latin1250_TO_Cyrilic1251(cString_ASCIII)
*******************************************************************
* String Latinice 238/1250 prevodi se u string ćirilice 204/1251
*---------------------------------------------------------------

LOCAL jj,;
 nString_Duzina := LEN(cString_ASCIII) ,; // duzina stringa
 cString_1251 := ""                    ,;
 cXhar := ""                           ,;
 cChar := ""

 DECLARE a_lat[62], a_cir[62]
 *****************************************
 Table_Convert_Latin1250_TO_Cyrilic1251()  
// tabela za konverziju latinica-u-čirilicu i obrnuto
 *****************************************
 * formirani nizovi a_lat, a_cir


 FOR jj = 1 To nString_Duzina

         cChar := SUBSTR(cString_ASCIII,jj,1)  // izdvoji karakter
         *********************************************
         cXhar := Char_Latin1250_TO_Cyrilic1251(cChar)
         *********************************************
         cString_1251 := cString_1251 + cXhar

 NEXT jj

RETURN(cString_1251)

******************************************************************** LATINICA U ĆIRILICU"
 FUNCTION Char_Latin1250_TO_Cyrilic1251(cChar)
********************************************************************
* Karakter Latinice 238/1250 prevodi se u karakter ćirilice 204/1251
*-------------------------------------------------------------------
// Prevodjenje KONVERZIJA primljenog ASCIII znaka (karaktera) 1250
// (latinica) u karakter po kodnoj strani 1251 (Windows cirilica) i
// vracanje tog novog karaktera u glavni program.

LOCAL jj, nn, nChar, nXhar, cXhar

 * cChar // PRIMLJENI znak koji se iz ansi ASCIII prevodi u 1251

 nChar  := ASC(cChar)   // numerik: CHR kod PRIMLJENOG znaka
 nXhar  := nChar        // numerik: inicijalno
 nn     := LEN(a_lat)


 FOR jj = 1 to nn

     IF a_lat[jj] == nChar   // ako nadjes u tabeli isti ansi ASC kod...
        nXhar := a_cir[jj]   // uzmi iz tabele odgovarajuci 1251 ASC kod
        EXIT                 // prekini dalje trazenje
     ENDIF

 NEXT jj

 cXhar := CHR(nXhar) // string: 1251 ASC kod PRIMLJENOG znaka prevedi u znak

RETURN(cXhar)









* RADNA FUNKCIJA KOJA SE POZIVA IZ APLIKACIJE
****************************************************************  ĆIRILICA U LATINICU
FUNCTION Cyrilic1251_TO_Latin1250(cString_1251)
****************************************************************
* String ćirilice 204/1251 prevodi se u string latinice 238/1250
*---------------------------------------------------------------

 LOCAL jj ,;
 nString_Duzina := LEN(cString_1251) ,;// duzina stringa
 cString_ASCIII := ""                ,;
 cXhar := ""                         ,;
 cChar := ""

 DECLARE a_lat[62], a_cir[62]
 *****************************************
 Table_Convert_Latin1250_TO_Cyrilic1251()   
// tabela za konverziju latinica-u-čirilicu i obrnuto
 *****************************************
 * formirani nizovi a_lat, a_cir


 FOR jj = 1 To nString_Duzina

         cChar := SUBSTR(cString_1251,jj,1)  // izdvoji karakter
         *********************************************
         cXhar := Char_Cyrilic1251_TO_Latin1250(cChar)
         *********************************************
         cString_ASCIII := cString_ASCIII + cXhar

 NEXT jj

RETURN (cString_ASCIII)

******************************************************************** ĆIRILICA U LATINICU
 FUNCTION Char_Cyrilic1251_TO_Latin1250(cChar)
********************************************************************
* Karakter Ćirilice 204/1251 prevodi se u karakter latinice 238/1250
*-------------------------------------------------------------------
// Prevodjenje KONVERZIJA primljenog ASCIII znaka (karaktera) 1251
// (cirilica) u karakter po kodnoj strani 1250 (Windows latinica) i
// vracanje tog novog karaktera u glavni program.



LOCAL jj, nn, nChar,nXhar,cXhar

 * cChar                // PRIMLJENI znak koji se iz ansi1251 prevodi u 1250

 nChar  := ASC(cChar)   // numerik: CHR kod PRIMLJENOG znaka
 nXhar  := nChar        // numerik: - inicijalno
 nn     := LEN(a_cir)

 FOR jj=1 to nn

     IF a_cir[jj] == nChar   // ako nadjes u tabeli isti ansi ASC kod...
        nXhar := a_lat[jj]   // uzmi iz tabele odgovarajuci 1250 ASC kod
        EXIT                 // prekini dalje trazenje
     ENDIF

 NEXT jj

 cXhar := CHR(nXhar)    // string: 1250 ASC kod PRIMLJENOG znaka prevedi u znak

RETURN(cXhar)






* 14-07-2019   // tabela za konverziju latinica-u-čirilicu i obrnuto
********************************************************************  LATINICA U ĆIRILICU
FUNCTION Table_Convert_Latin1250_TO_Cyrilic1251()
********************************************************************  ĆIRILICA U LATINICU
* Karakter Latinice 238/1250 prevodi se u karakter ćirilice 204/1251
*-------------------------------------------------------------------
// Tabela za Prevodjenje KONVERZIJU ASCIII znaka 238/1250 (latinica)
// u ASCIII znak po kodnoj strani 204/1251 (ćirilica)
// koristi CHR kodove znakova, a formira PUBLIC array:
// a_lat - sa 1 do 62 znaka latinice i
// a_cir - sa odgovarajućih 1 do 62 znaka ćirilice

* LOCAL nn := 62
* DECLARE a_lat[nn], a_cir[nn]

*--- velika slova
 a_lat[1]  := 65         // A  latinica
 a_cir[1]  := 192        //    ćirilica
 a_lat[2]  := 66         // B
 a_cir[2]  := 193
 a_lat[3]  := 67         // C
 a_cir[3]  := 214
 a_lat[4]  := 68         // D
 a_cir[4]  := 196
 a_lat[5]  := 69         // E
 a_cir[5]  := 197
 a_lat[6]  := 70         // F
 a_cir[6]  := 212
 a_lat[7]  := 71         // G
 a_cir[7]  := 195
 a_lat[8]  := 72         // H
 a_cir[8]  := 213
 a_lat[9]  := 73         // I --- ovde je slovo I
 a_cir[9]  := 200
 a_lat[10] := 74         // J
 a_cir[10] := 163
 a_lat[11] := 75         // K
 a_cir[11] := 202
 a_lat[12] := 76         // L
 a_cir[12] := 203
 a_lat[13] := 77         // M
 a_cir[13] := 204
 a_lat[14] := 78         // N
 a_cir[14] := 205
 a_lat[15] := 79         // O
 a_cir[15] := 206
 a_lat[16] := 80         // P
 a_cir[16] := 207
 a_lat[17] := 82         // R
 a_cir[17] := 208
 a_lat[18] := 83         // S
 a_cir[18] := 209
 a_lat[19] := 84         // T
 a_cir[19] := 210
 a_lat[20] := 85         // U
 a_cir[20] := 211
 a_lat[21] := 86         // V
 a_cir[21] := 194
 a_lat[22] := 89         // Y
 a_cir[22] := 200        // I --- ovde je slovo I umesto Y
 a_lat[23] := 90         // Z
 a_cir[23] := 199
*--- mala slova
 a_lat[24]  := 97        // a
 a_cir[24]  := 224
 a_lat[25]  := 98        // b
 a_cir[25]  := 225
 a_lat[26]  := 99        // c
 a_cir[26]  := 246
 a_lat[27]  := 100       // d
 a_cir[27]  := 228
 a_lat[28]  := 101       // e
 a_cir[28]  := 229
 a_lat[29]  := 102       // f
 a_cir[29]  := 244
 a_lat[30]  := 103       // g
 a_cir[30]  := 227
 a_lat[31]  := 104       // h
 a_cir[31]  := 245
 a_lat[32]  := 105       // i
 a_cir[32]  := 232       // i --- ovde je slovo i
 a_lat[33] := 106        // j
 a_cir[33] := 188
 a_lat[34] := 107        // k
 a_cir[34] := 234
 a_lat[35] := 108        // l
 a_cir[35] := 235
 a_lat[36] := 109        // m
 a_cir[36] := 236
 a_lat[37] := 110        // n
 a_cir[37] := 237
 a_lat[38] := 111        // o
 a_cir[38] := 238
 a_lat[39] := 112        // p
 a_cir[39] := 239
 a_lat[40] := 114        // r
 a_cir[40] := 240
 a_lat[41] := 115        // s
 a_cir[41] := 241
 a_lat[42] := 116        // t
 a_cir[42] := 242
 a_lat[43] := 117        // u
 a_cir[43] := 243
 a_lat[44] := 118        // v
 a_cir[44] := 226
 a_lat[45] := 121        // y
 a_cir[45] := 232        // i --- ovde je slovo i umesto y
 a_lat[46] := 122        // z
 a_cir[46] := 231        //
********************************************

* test:
* "ŠĐČĆŽ šđčćž coba COBA"
*  chr(216)+chr(128)+chr(215)+chr(142)+chr(198)  // ŠĐČĆŽ
*  chr(248)+chr(144)+chr(247)+chr(158)+chr(230)  // šđčćž
*  chr(246)+chr(238)+chr(225)+chr(224)           // coba
*  chr(214)+chr(206)+chr(193)+chr(192)           // COBA


*--- velika slova

 a_lat[47] := 138 //123  // Š {
 a_cir[47] := 216        // Š šljiva

 a_lat[48] := 208 //125  // Đ }
 a_cir[48] := 128        // Đ đordje

 a_lat[49] := 200 //58   // Č :
 a_cir[49] := 215        // Č Čučuk

 a_lat[50] := 198 //34   // Ć "
 a_cir[50] := 142        // Ć Ćurka

 a_lat[51] := 142 //124  // Ž |
 a_cir[51] := 198        // Ž Žaba

 a_lat[52] := 81         // Q
 a_cir[52] := 138        // LJ

 a_lat[53] := 87         // W
 a_cir[53] := 140        // NJ

 a_lat[54] := 88         // X
 a_cir[54] := 143        // DŽ (DŽAMBO DŽET)

*--- mala slova

 a_lat[55] := 154 //91   // š [
 a_cir[55] := 248        // š šljiva

 a_lat[56] := 240 //93   // đ ]
 a_cir[56] := 144        // đ đordje

 a_lat[57] := 232 //59   // č ;
 a_cir[57] := 247        // č čučuk stana

 a_lat[58] := 230 //39   // ć '
 a_cir[58] := 158        // ć ćurka

 a_lat[59] := 158 //92   // ž \
 a_cir[59] := 230        // ž žaba

 a_lat[60] := 113        // q
 a_cir[60] := 154        // lj

 a_lat[61] := 119        // w
 a_cir[61] := 156        // nj

 a_lat[62] := 120        // x
 a_cir[62] := 159        // dž (džambo džet)


RETURN NIL











*"======================================="
*"UTF8 FONTOVI --- FUNKCIJE ZA BIBLIOTEKU"
*"======================================="
* Sa UTF8 prevodi se string u Serbian latin ili u Serbian Cyrilic
* ako je windows postavljen na Serbian latin 238/1250 tada je
* latinica čitljiva a ćirilica nije čitljiva
* ako je windows postavljen na Serbian cyrilic 204/1251 tada je
* ćirilica čitljiva a latinica nije čitljiva

*******************************************************************
FUNCTION UTF8_TO_Cyrilic1251_Latin1250(cString_UTF8)
*******************************************************************
* String UTF8 prevodi se u string ćirilice 204/1251
* String UTF8 prevodi se u string latinice 238/1250
*---------------------------------------------------------------

LOCAL jj,;
 nString_Duzina := LEN(cString_UTF8) ,; // duzina stringa
 cString_cirilica_latinica := ""     ,;
 cString_cirilica          := ""     ,;
 cXhar := ""                         ,;
 cChar := ""

 DECLARE a_utf[122], a_cir[122]
 *********************************************
 Table_Convert_UTF8_TO_Cyrilic1251_Latin1250()      // tabela za konverziju UTF8 u
 *********************************************      // čirilicu i latinicu
 * formirani nizovi a_utf, a_cir


/*
 * TEST-START
 * iz stringa se izima po dva karaktera za ćirilicu i ovo radi odlično

 FOR jj = 1 To nString_Duzina step 2

         cChar := SUBSTR(cString_UTF8,jj,2)            // izdvoji dva karaktera (slovo)
         *********************************************
         cXhar := Char_UTF8_TO_Cyrilic1251(cChar)      // vrati jedan karakter (slovo)
         *********************************************
         cString_cirilica := cString_cirilica + cXhar  // formiraj novi string (reč)

 NEXT jj

 RETURN(cString_cirilica)
* TEST-END
*/


* ali kada se ne zna da li je ćirilica ili latinica, jer u UTF8 mogu da budu
* zajedno i reči sa čirilicom i reči sa latinicom, tada treba izvršiti kontrolu
* hexkoda karaktera (slova) i ako hexkod pripada skupu UTF8 latinice bez ŠĐČĆŽšđčćž
* (u tom skupu svaki UTF8 karakter (slovo) ima jedan karakter isti kao i ANSI karakter)
* tada se iz stringa uzima jedan karakter - u protivnom uzimaju se dva karaktera


 FOR jj = 1 To nString_Duzina step 1  // kontroliše se svaki karakter UTF8 stringa



       cChar := SUBSTR(cString_UTF8,jj,1)  // izdvoji jedan UTF8 karakter iz stringa
       nChar  := StrToHex(cChar)           // numerik: HEX kod izdvojenog karaktera

// proveri kom UTF8 slovu pripada ovaj HEX kod:
IF AT(nChar,;  // UTF8 latin bez Serbian latin znakova ŠĐČĆŽšđčćž           "41,42,43,44,45,46,47,48,49,4A,4B,4C,4D,4E,4F,50,51,52,53,54,55,56,57,58,59,5A,"+;             "61,62,63,64,65,66,67,68,69,6A,6B,6C,6D,6E,6F,70,71,72,73,74,75,76,77,78,79,7A")>0  

       * iz UTF8 stringa se kao UTF8 slovo uzima jedan karakter - ovaj karakter
       * i taj karakter se prevodi iz UTF8 u ANSI karakter cXhar
       **************************************************
       cXhar := Char_UTF8_TO_Cyrilic1251_Latin1250(cChar)
       **************************************************
       cString_cirilica_latinica := cString_cirilica_latinica + cXhar


ELSE

       * iz UTF8 stringa se kao UTF8 slovo uzimaju dva karaktera
       * ovaj i sledeći karakter i ta dva karaktera se prevode
       * iz UTF8 u ANSI karakter cXhar

       cChar := SUBSTR(cString_UTF8,jj,2) // izdvoji DVA UTF8 karaktera iz stringa
       **************************************************
       cXhar := Char_UTF8_TO_Cyrilic1251_Latin1250(cChar)
       **************************************************
       cString_cirilica_latinica := cString_cirilica_latinica + cXhar

       jj:=jj+1  // nastavi brojanje posle dva karaktera (step 2) !

 ENDIF


 NEXT jj



RETURN(cString_cirilica_latinica)

********************************************************************
 FUNCTION Char_UTF8_TO_Cyrilic1251_Latin1250(cChar)
********************************************************************
* Karakter UTF8 prevodi se u karakter ćirilice 204/1251
* Karakter UTF8 prevodi se u karakter latinice 238/1250
*-------------------------------------------------------------------
// Prevodjenje KONVERZIJA primljenog UTF8 znaka (karaktera)
// u ANSI karakter po kodnoj strani 1251 (Windows cirilica) i
// vracanje tog novog karaktera u glavni program.

// Prevodjenje KONVERZIJA primljenog UTF8 znaka (karaktera)
// u ANSI karakter po kodnoj strani 1250 (Windows latinica) i
// vracanje tog novog karaktera u glavni program.


LOCAL jj, nn, nChar, nXhar, cXhar

 * cChar // PRIMLJENI znak koji se iz UTF8 prevodi u ANSI

 nChar  := StrToHex(cChar)   // numerik: HEX kod PRIMLJENOG znaka
 nXhar  := nChar             // numerik: inicijalno
 nn     := LEN(a_utf)


*** STOP("nChar",nChar,1)  // HEXADECIMALNOI UTF8 --- TEST

 FOR jj = 1 to nn

     IF a_utf[jj] == nChar   // ako nadjes u tabeli isti UTF8 HEX kod...
        nXhar := a_cir[jj]   // uzmi iz tabele odgovarajuci ANSI HEX kod
        EXIT                 // prekini dalje trazenje
     ENDIF

 NEXT jj

*** STOP("nXhar",nXhar,1)  // HEXADECIMALNO ANSI --- TEST

 cXhar := HexToStr(nXhar)  // string: ANSI HEX kod PRIMLJENOG znaka prevedi u znak

RETURN(cXhar)




* 14-07-2019
* // tabela koja prevodi utf8 u ćirilicu i latinicu i obrnuto
********************************************************************
FUNCTION Table_Convert_UTF8_TO_Cyrilic1251_Latin1250()
********************************************************************
* Karakter UTF8 prevodi se u karakter ćirilice 204/1251 --- napisana tabela
* Karakter UTF8 prevodi se u karakter latinice 238/1250 --- napisati tabelu
*-------------------------------------------------------------------

/*

***************************************************
 Tabela za Prevodjenje KONVERZIJU UTF8 KARAKTERA
 u ASCIII znak po kodnoj strani 204/1251 (ćirilica)
 koristi HEX kodove znakova, a formira PUBLIC array:
 a_utf - sa 1 do 60 znaka unicode utf8 i
 a_cir - sa odgovarajućih 1 do 60 znaka ćirilice





Velika ćirilična slova UTF8
------------------------------------------------------
UTF8   CHAR     HEX              OCT            DEC
------------------------------------------------------
U+0410 A      0xD0 0x90    \320\220     А
U+0411 B      0xD0 0x91    \320\221     Б
U+0412 V      0xD0 0x92    \320\222     В
U+0413 G      0xD0 0x93    \320\223     Г
U+0414 D      0xD0 0x94    \320\224     Д
U+0415 E      0xD0 0x95    \320\225     Е
U+0416 Ž      0xD0 0x96    \320\226     Ж
U+0417 Z      0xD0 0x97    \320\227     З
U+0418 I      0xD0 0x98    \320\230     И
U+041A K      0xD0 0x9A    \320\232     К
U+041B L      0xD0 0x9B    \320\233     Л
U+041C M      0xD0 0x9C    \320\234     М
U+041D N      0xD0 0x9D    \320\235     Н
U+041E O      0xD0 0x9E    \320\236     О
U+041F P      0xD0 0x9F    \320\237     П
U+0420 R      0xD0 0xA0    \320\240     Р
U+0421 S      0xD0 0xA1    \320\241     С
U+0422 T      0xD0 0xA2    \320\242     Т
U+0423 U      0xD0 0xA3    \320\243     У
U+0424 F      0xD0 0xA4    \320\244     Ф
U+0425 H      0xD0 0xA5    \320\245     Х
U+0426 C      0xD0 0xA6    \320\246     Ц
U+0427 Č      0xD0 0xA7    \320\247     Ч
U+0428 Š      0xD0 0xA8    \320\250     Ш
U+0402 Đ      0xD0 0x82    \320\202     Ђ
U+0408 J      0xD0 0x88    \320\210     Ј
U+0409 LJ     0xD0 0x89    \320\211     Љ
U+040A NJ     0xD0 0x8A    \320\212     Њ
U+040B Ć      0xD0 0x8B    \320\213     Ћ
U+040F DŽ     0xD0 0x8F    \320\217     Џ


Mala ćirilična slova UTF8
------------------------------------------------------
UTF8   CHAR     HEX              OCT            DEC
------------------------------------------------------
U+0430 a      0xD0 0xB0    \320\260     а
U+0431 b      0xD0 0xB1    \320\261     б
U+0432 v      0xD0 0xB2    \320\262     в
U+0433 g      0xD0 0xB3    \320\263     г
U+0434 d      0xD0 0xB4    \320\264     д
U+0435 e      0xD0 0xB5    \320\265     е
U+0436 ž      0xD0 0xB6    \320\266     ж
U+0437 z      0xD0 0xB7    \320\267     з
U+0438 i      0xD0 0xB8    \320\270     и
U+043A k      0xD0 0xBA    \320\272     к
U+043B l      0xD0 0xBB    \320\273     л
U+043C m      0xD0 0xBC    \320\274     м
U+043D n      0xD0 0xBD    \320\275     н
U+043E o      0xD0 0xBE    \320\276     о
U+043F p      0xD0 0xBF    \320\277     п
U+0440 r      0xD0 0xC0    \320\280     р
U+0441 s      0xD0 0xC1    \320\281     с
U+0442 t      0xD0 0xC2    \320\282     т
U+0443 u      0xD0 0xC3    \320\283     у
U+0444 f      0xD0 0xC4    \320\284     ф
U+0445 h      0xD0 0xC5    \320\285     х
U+0446 c      0xD0 0xC6    \320\286     ц
U+0447 č      0xD0 0xC7    \320\287     ч
U+0448 š      0xD0 0xC8    \320\290     ш
U+0458 j      0xD1 0x98    \321\230     ј
U+0459 lj     0xD1 0x99    \321\231     љ
U+045A nj     0xD1 0x9A    \321\232     њ
U+045B ć      0xD1 0x9B    \321\233     ћ
U+045F dž     0xD1 0x9F    \321\237     џ
U+0452 đ      0xD1 0x92    \321\222     ђ



Velika ćirilična slova 204/1251
-------------------------------
A  C0
B  C1
V  C2
G  C3
D  C4
E  C5
Ž  C6
Z  C7
I  C8
K  CA
L  CB
M  CC
N  CD
O  CE
P  CF
R  D0
S  D1
T  D2
U  D3
F  D4
H  D5
C  D6
Č  D7
Š  D8
Đ  80
J  A3
LJ 8A
NJ 8C
Ć  8E
DŽ 8F

mala ćirilična slova 204/1251
-------------------------------
a  E0
b  E1
v  E2
g  E3
d  E4
e  E5
ž  E6
z  E7
i  E8
k  EA
l  EB
m  EC
n  ED
o  EE
p  EF
r  F0
s  F1
t  F2
u  F3
f  F4
h  F5
c  F6
č  F7
š  F8
j  BC
lj 9A
nj 9C
ć  9E
dž 9F
đ  90


***************************************************
 Tabela za Prevodjenje KONVERZIJU UTF8 KARAKTERA
 u ASCIII znak po kodnoj strani 238/1250 (latinica)
 koristi HEX kodove znakova, a formira PUBLIC array:
 a_utf - sa 1 do 62 znaka unicode utf8 i
 a_cir - sa odgovarajućih 1 do 62 znaka latinice



Velika latinična slova UTF8
--------------------------------------
UTF8   CHAR     HEX     OCT     DEC
--------------------------------------
U+0041 A      0x41   \101   A  ili CHR(65)
U+0042 B      0x42   \102   B
U+0043 C      0x43   \103   C
U+0044 D      0x44   \104   D
U+0045 E      0x45   \105   E
U+0046 F      0x46   \106   F
U+0047 G      0x47   \107   G
U+0048 H      0x48   \110   H
U+0049 I      0x49   \111   I
U+004A J      0x4A   \112   J
U+004B K      0x4B   \113   K
U+004C L      0x4C   \114   L
U+004D M      0x4D   \115   M
U+004E N      0x4E   \116   N
U+004F O      0x4F   \117   O
U+0050 P      0x50   \120   P
U+0051 Q      0x51   \121   Q
U+0052 R      0x52   \122   R
U+0053 S      0x53   \123   S
U+0054 T      0x54   \124   T
U+0055 U      0x55   \125   U
U+0056 V      0x56   \126   V
U+0057 W      0x57   \127   W
U+0058 X      0x58   \130   X
U+0059 Y      0x59   \131   Y
U+005A Z      0x5A   \132   Z

Mala latinična slova UTF8
--------------------------------------
UTF8   CHAR     HEX     OCT     DEC
--------------------------------------
U+0061 a      0x61   \141   a
U+0062 b      0x62   \142   b
U+0063 c      0x63   \143   c
U+0064 d      0x64   \144   d
U+0065 e      0x65   \145   e
U+0066 f      0x66   \146   e
U+0067 g      0x67   \147   g
U+0068 h      0x68   \150   h
U+0069 i      0x69   \151   i
U+006A j      0x6A   \152   j
U+006B k      0x6B   \153   k
U+006C l      0x6C   \154   l
U+006D m      0x6D   \155   m
U+006E n      0x6E   \156   n
U+006F o      0x6F   \157   o
U+0070 p      0x70   \160   p
U+0071 q      0x71   \161   q
U+0072 r      0x72   \162   r
U+0073 s      0x73   \163   s
U+0074 t      0x74   \164   t
U+0075 u      0x75   \165   u
U+0076 v      0x76   \166   v
U+0077 w      0x77   \167   w
U+0078 x      0x78   \170   x
U+0079 y      0x79   \171   y
U+007A z      0x7A   \172   z

Naša dodatna latinična slova UTF8
------------------------------------------------------
UTF8   CHAR     HEX              OCT            DEC
------------------------------------------------------
U+0160 Š      0xC5 0xA0    \305\240     Š
U+0161 š      0xC5 0xA1    \305\241     š
U+0110 Đ      0xC4 0x90    \304\220     Đ
U+0111 đ      0xC4 0x91    \304\221     đ
U+010C Č      0xC4 0x8C    \304\214     Č
U+010D č      0xC4 0x8D    \304\215     č
U+0106 Ć      0xC4 0x86    \304\206     Ć
U+0107 ć      0xC4 0x87    \304\207     ć
U+017D Ž      0xC5 0xBD    \305\275     Ž
U+017E ž      0xC5 0xBE    \305\276     ž


velika latinična slova 238/1250
-------------------------------
A  41
B  42
C  43
D  44
E  45
F  46
G  47
H  48
I  49
J  4A
K  4B
L  4C
M  4D
N  4E
O  4F
P  50
Q  51
R  52
S  53
T  54
U  55
V  56
W  57
X  58
Y  59
Z  5A


mala latinična slova 238/1250
-------------------------------
a  61
b  62
c  63
d  64
e  65
f  66
g  67
h  68
i  69
j  6A
k  6B
l  6C
m  6D
n  6E
o  6F
p  70
q  71
r  72
s  73
t  74
u  75
v  76
w  77
x  78
y  79
z  7A


serbian latinična slova 238/1250
--------------------------------
* ŠšĐđČčĆ掞

Š  8A
š  9A
Đ  D0
đ  F0
Č  C8
č  E8
Ć  C6
ć  E6
Ž  8E
ž  9E

*/


* LOCAL nn := 122               // 60+62 postavlja se u glavnom programu
* DECLARE a_utf[nn], a_cir[nn]  // postavlja se u glavnom programu

*---------------------------
*---VELIKA ĆIRILIČNA SLOVA
*---------------------------

 a_utf[1]  := "D090"   // A  UTF8 ćirilica
 a_cir[1]  := "C0"     // A  1251 ćirilica
 a_utf[2]  := "D091"   // B
 a_cir[2]  := "C1"
 a_utf[3]  := "D092"   // V
 a_cir[3]  := "C2"
 a_utf[4]  := "D093"   // G
 a_cir[4]  := "C3"
 a_utf[5]  := "D094"   // D
 a_cir[5]  := "C4"
 a_utf[6]  := "D095"   // E
 a_cir[6]  := "C5"
 a_utf[7]  := "D096"   // Ž
 a_cir[7]  := "C6"
 a_utf[8]  := "D097"    // Z
 a_cir[8]  := "C7"
 a_utf[9]  := "D098"    // I
 a_cir[9]  := "C8"
 a_utf[10]  := "D09A"   // K
 a_cir[10]  := "CA"
 a_utf[11]  := "D09B"   // L
 a_cir[11]  := "CB"
 a_utf[12]  := "D09C"   // M
 a_cir[12]  := "CC"
 a_utf[13]  := "D09D"   // N
 a_cir[13]  := "CD"
 a_utf[14]  := "D09E"   // O
 a_cir[14]  := "CE"
 a_utf[15]  := "D09F"   // P
 a_cir[15]  := "CF"
 a_utf[16]  := "D0A0"   // R
 a_cir[16]  := "D0"
 a_utf[17]  := "D0A1"   // S
 a_cir[17]  := "D1"
 a_utf[18]  := "D0A2"   // T
 a_cir[18]  := "D2"
 a_utf[19]  := "D0A3"   // U
 a_cir[19]  := "D3 "
 a_utf[20]  := "D0A4"   // F
 a_cir[20]  := "D4"
 a_utf[21]  := "D0A5"   // H
 a_cir[21]  := "D5"
 a_utf[22]  := "D0A6"   // C
 a_cir[22]  := "D6"
 a_utf[23]  := "D0A7"   // Č
 a_cir[23]  := "D7"
 a_utf[24]  := "D0A8"   // Š
 a_cir[24]  := "D8"
 a_utf[25]  := "D082"   // Đ
 a_cir[25]  := "80"
 a_utf[26]  := "D088"   // J
 a_cir[26]  := "A3"
 a_utf[27]  := "D089"   // LJ
 a_cir[27]  := "8A"
 a_utf[28]  := "D08A"   // NJ
 a_cir[28]  := "8C"
 a_utf[29]  := "D08B"   // Ć
 a_cir[29]  := "8E"
 a_utf[30]  := "D08F"   // DŽ
 a_cir[30]  := "8F"


*---------------------------
*---MALA ĆIRILIČNA SLOVA
*---------------------------
 a_utf[31]  := "D0B0"   // a  UTF8 ćirilica
 a_cir[31]  := "E0"     // a  1251 ćirilica
 a_utf[32]  := "D0B1"   // b
 a_cir[32]  := "E1"
 a_utf[33]  := "D0B2"   // v
 a_cir[33]  := "E2"
 a_utf[34]  := "D0B3"   // g
 a_cir[34]  := "E3"
 a_utf[35]  := "D0B4"   // d
 a_cir[35]  := "E4"
 a_utf[36]  := "D0B5"   // e
 a_cir[36]  := "E5"
 a_utf[37]  := "D0B6"   // ž
 a_cir[37]  := "E6"
 a_utf[38]  := "D0B7"   // z
 a_cir[38]  := "E7"
 a_utf[39]  := "D0B8"   // i
 a_cir[39]  := "E8"
 a_utf[40]  := "D0BA"   // k
 a_cir[40]  := "EA"
 a_utf[41]  := "D0BB"   // l
 a_cir[41]  := "EB"
 a_utf[42]  := "D0BC"   // m
 a_cir[42]  := "EC"
 a_utf[43]  := "D0BD"   // n
 a_cir[43]  := "ED"
 a_utf[44]  := "D0BE"   // o
 a_cir[44]  := "EE"
 a_utf[45]  := "D0BF"   // p
 a_cir[45]  := "EF"
 a_utf[46]  := "D0C0"   // r
 a_cir[46]  := "F0"
 a_utf[47]  := "D0C1"   // s
 a_cir[47]  := "F1"
 a_utf[48]  := "D0C2"   // t
 a_cir[48]  := "F2"
 a_utf[49]  := "D0C3"   // u
 a_cir[49]  := "F3 "
 a_utf[50]  := "D0C4"   // f
 a_cir[50]  := "F4"
 a_utf[51]  := "D0C5"   // h
 a_cir[51]  := "F5"
 a_utf[52]  := "D0C6"   // c
 a_cir[52]  := "F6"
 a_utf[53]  := "D0C7"   // č
 a_cir[53]  := "F7"
 a_utf[54]  := "D0C8"   // š
 a_cir[54]  := "F8"
 a_utf[55]  := "D198"   // j
 a_cir[55]  := "BC"
 a_utf[56]  := "D199"   // lj
 a_cir[56]  := "9A"
 a_utf[57]  := "D19A"   // nj
 a_cir[57]  := "9C"
 a_utf[58]  := "D19B"   // ć
 a_cir[58]  := "9E"
 a_utf[59]  := "D19F"   // dž
 a_cir[59]  := "9F"
 a_utf[60]  := "D192"   // đ
 a_cir[60]  := "90"


/*
24-07-2019
==========
Unicode ima iste kodove za velika i mala slova
latinice ABECEDE kao i ANSI 238/1250
Razlikuju se samo unicode kodovi za ŠĐČĆŽšđčćž
od kodova koje ima ANSI 238/1250 i zbog toga se
mora vršiti prevođenje UTF8 latinice u ANSI
Serbian latin kodove

unicode string iz lične karte može biti ćirilica
a može biti i latinica. Unicode string se uzima
iz lične karte i svako slovo stringa se prevodi
ili na latinicu ili na ćirilicu, čime će se neki
stringovi (varijable) dobiti na latinici a neki
na ćirilici.

Ako je Windows u modu rada Serbian Latin
tada će se string latinice čitati a string
ćirilice neće se čitati osim ako se prikaže
fontom sa codepage 204/1251 ćirilica,
ili ako se pre prikaza konvertuje u string latinice

Ako je Windows u modu rada Serbian Cyrilic
tada će se string ćirilice čitati a string
latinice neće se čitati osim ako se prikaže
fontom sa codepage 238/1250 latinica,
ili ako se pre čitanja konvertuje u string ćirilice

sve ovo se radi putem ovih tabela, ali treba
pokušati i sa Alaska Xbase++ komandama za unicode
koje nisu dokumentovane u 1.9 već u 2.0 ali rade
i u 1.9-355 sl1:
IsUnicode()
Str2Unicode()   // ne radi ?
Unicode2Str()   // ne radi ?
moraju se koristiti moje tabele za prevođenje

---------------------------------------------
 a_utf[61]  := "41"   // A  UTF8 latinica
 a_utf[62]  := "42"   // B
 a_utf[63]  := "43"   // C
 a_utf[64]  := "44"   // D
 a_utf[65]  := "45"   // E
 a_utf[66]  := "46"   // F
 a_utf[67]  := "47"   // G
 a_utf[68]  := "48"   // H
 a_utf[69]  := "49"   // I
 a_utf[70]  := "4A"   // J
 a_utf[71]  := "4B"   // K
 a_utf[72]  := "4C"   // L
 a_utf[73]  := "4D"   // M
 a_utf[74]  := "4E"   // N
 a_utf[75]  := "4F"   // O
 a_utf[76]  := "50"   // P
 a_utf[77]  := "51"   // Q
 a_utf[78]  := "52"   // R
 a_utf[79]  := "53"   // S
 a_utf[80]  := "54"   // T
 a_utf[81]  := "55"   // U
 a_utf[82]  := "56"   // V
 a_utf[83]  := "57"   // W
 a_utf[84]  := "58"   // X
 a_utf[85]  := "59"   // Y
 a_utf[86]  := "5A"   // Z
 a_utf[87]  := "61"   // a  UTF8 latinica
 a_utf[88]  := "62"   // b
 a_utf[89]  := "63"   // c
 a_utf[90]  := "64"   // d
 a_utf[91]  := "65"   // e
 a_utf[92]  := "66"   // f
 a_utf[93]  := "67"   // g
 a_utf[94]  := "68"   // h
 a_utf[95]  := "69"   // i
 a_utf[96]  := "6A"   // j
 a_utf[97]  := "6B"   // k
 a_utf[98]  := "6C"   // l
 a_utf[99]  := "6D"   // m
 a_utf[100]  := "6E"   // n
 a_utf[101]  := "6F"   // o
 a_utf[102]  := "70"   // p
 a_utf[103]  := "71"   // q
 a_utf[104]  := "72"   // r
 a_utf[105]  := "73"   // s
 a_utf[106]  := "74"   // t
 a_utf[107]  := "75"   // u
 a_utf[108]  := "76"   // v
 a_utf[109]  := "77"   // w
 a_utf[110]  := "78"   // x
 a_utf[111]  := "79"   // y
 a_utf[112]  := "7A"   // z

IF AT(znak,;  // UTF8 latinica bez Serbian latin znakova ŠĐČĆŽšđčćž (ABECEDA)
   "41,42,43,44,45,46,47,48,49,4A,4B,4C,4D,4E,4F,50,51,52,53,54,55,56,57,58,59,5A
   "61,62,63,64,65,66,67,68,69,6A,6B,6C,6D,6E,6F,70,71,72,73,74,75,76,77,78,79,7A")>0
ENDIF

*/


*---------------------------
*---VELIKA LATINIČNA SLOVA
*---------------------------
 a_utf[61]  := "41"   // A  UTF8 latinica
 a_cir[61]  := "41"   // A  1250 latinica
 a_utf[62]  := "42"   // B
 a_cir[62]  := "42"   //
 a_utf[63]  := "43"   // C
 a_cir[63]  := "43"   //
 a_utf[64]  := "44"   // D
 a_cir[64]  := "44"   //
 a_utf[65]  := "45"   // E
 a_cir[65]  := "45"   //
 a_utf[66]  := "46"   // F
 a_cir[66]  := "46"   //
 a_utf[67]  := "47"   // G
 a_cir[67]  := "47"   //
 a_utf[68]  := "48"   // H
 a_cir[68]  := "48"   //
 a_utf[69]  := "49"   // I
 a_cir[69]  := "49"   //
 a_utf[70]  := "4A"   // J
 a_cir[70]  := "4A"   //
 a_utf[71]  := "4B"   // K
 a_cir[71]  := "4B"   //
 a_utf[72]  := "4C"   // L
 a_cir[72]  := "4C"   //
 a_utf[73]  := "4D"   // M
 a_cir[73]  := "4D"   //
 a_utf[74]  := "4E"   // N
 a_cir[74]  := "4E"   //
 a_utf[75]  := "4F"   // O
 a_cir[75]  := "4F"   //
 a_utf[76]  := "50"   // P
 a_cir[76]  := "50"   //
 a_utf[77]  := "51"   // Q
 a_cir[77]  := "51"   //
 a_utf[78]  := "52"   // R
 a_cir[78]  := "52"   //
 a_utf[79]  := "53"   // S
 a_cir[79]  := "53"   //
 a_utf[80]  := "54"   // T
 a_cir[80]  := "54"   //
 a_utf[81]  := "55"   // U
 a_cir[81]  := "55"   //
 a_utf[82]  := "56"   // V
 a_cir[82]  := "56"   //
 a_utf[83]  := "57"   // W
 a_cir[83]  := "57"   //
 a_utf[84]  := "58"   // X
 a_cir[84]  := "58"   //
 a_utf[85]  := "59"   // Y
 a_cir[85]  := "59"   //
 a_utf[86]  := "5A"   // Z
 a_cir[86]  := "5A"   //


*---------------------------
*---MALA LATINIČNA SLOVA
*---------------------------

 a_utf[87]  := "61"   // a  UTF8 latinica
 a_cir[87]  := "61"   // a  1250 latinica
 a_utf[88]  := "62"   // b
 a_cir[88]  := "62"   //
 a_utf[89]  := "63"   // c
 a_cir[89]  := "63"   //
 a_utf[90]  := "64"   // d
 a_cir[90]  := "64"   //
 a_utf[91]  := "65"   // e
 a_cir[91]  := "65"   //
 a_utf[92]  := "66"   // f
 a_cir[92]  := "66"   //
 a_utf[93]  := "67"   // g
 a_cir[93]  := "67"   //
 a_utf[94]  := "68"   // h
 a_cir[94]  := "68"   //
 a_utf[95]  := "69"   // i
 a_cir[95]  := "69"   //
 a_utf[96]  := "6A"   // j
 a_cir[96]  := "6A"   //
 a_utf[97]  := "6B"   // k
 a_cir[97]  := "6B"   //
 a_utf[98]  := "6C"   // l
 a_cir[98]  := "6C"   //
 a_utf[99]  := "6D"   // m
 a_cir[99]  := "6D"   //
 a_utf[100]  := "6E"   // n
 a_cir[100]  := "6E"   //
 a_utf[101]  := "6F"   // o
 a_cir[101]  := "6F"   //
 a_utf[102]  := "70"   // p
 a_cir[102]  := "70"   //
 a_utf[103]  := "71"   // q
 a_cir[103]  := "71"   //
 a_utf[104]  := "72"   // r
 a_cir[104]  := "72"   //
 a_utf[105]  := "73"   // s
 a_cir[105]  := "73"   //
 a_utf[106]  := "74"   // t
 a_cir[106]  := "74"   //
 a_utf[107]  := "75"   // u
 a_cir[107]  := "75"   //
 a_utf[108]  := "76"   // v
 a_cir[108]  := "76"   //
 a_utf[109]  := "77"   // w
 a_cir[109]  := "77"   //
 a_utf[110]  := "78"   // x
 a_cir[110]  := "78"   //
 a_utf[111]  := "79"   // y
 a_cir[111]  := "79"   //
 a_utf[112]  := "7A"   // z
 a_cir[112]  := "7A"   //


*------------------------------
* SERBIAN LATIN SLOVA 238/1250
*------------------------------
* ŠšĐđČčĆ掞

 a_utf[113]  := "C5A0" // Š
 a_cir[113]  := "8A"   //
 a_utf[114]  := "C5A1" // š
 a_cir[114]  := "9A"   //


 a_utf[115]  := "C490" // Đ
 a_cir[115]  := "D0"   //
 a_utf[116]  := "C491" // đ
 a_cir[116]  := "F0"   //


 a_utf[117]  := "C48C" // Č
 a_cir[117]  := "C8"   //
 a_utf[118]  := "C48D" // č
 a_cir[118]  := "E8"   //


 a_utf[119]  := "C486" // Ć
 a_cir[119]  := "C6"   //
 a_utf[120]  := "C487" // ć
 a_cir[120]  := "E6"   //


 a_utf[121]  := "C5BD" // Ž
 a_cir[121]  := "8E"   //
 a_utf[122]  := "C5BE" // ž
 a_cir[122]  := "9E"   //

 **********************************************************************
 *               Š  š     Đ    đ    Č    č    Ć    ć    Ž    ž
 * IF AT(char,"C5A0,C5A1,C490,C491,C48C,C48D,C486,C487,C5BD,C5BE") > 0
 *   // ako je UTF8 Serbian Latin character   - uvek ima dva znaka
 *   // ako je UTF8 Serbian Cyrilic karakter  - uvek ima dva znaka
 *   // samo ako je UTF8 Latin character      - uvek ima jedan znak
 *   // U skladu sa svakim ide druga akcija...
 * ENDIF
 *
 **********************************************************************

RETURN NIL



* TEST FUNKCIJA
*************************************************************************
FUNCTION dobijanje_hex_kodova_za_ansi_slova()
*************************************************************************
* kako brzo dobiti sve hexadecimalne kodove za Serbian Latin i Serbian Cyrilic

aHex := {}
* velika slova ćirilice
*           "ABVGDEŽZIKLMNOPRSTUFHCČŠĐJQWĆX"
* string := "ŔÁÂĂÄĹĆÇČĘËĚÍÎĎĐŃŇÓÔŐÖ×Ř€ŁŠŚŽŹ"
* broj := 30

* mala slova ćirilice
*           "abvgdežziklmnoprstufhcčšjqwćxđ"
* string := "ŕáâăäĺćçčęëěíîďđńňóôőö÷řĽšśžź"
* broj := 30

* velika slova latinice
*           "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
* string := "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
* broj := 26

* mala slova latinice
*           "abcdefghijklmnopqrstuvwxyz"
* string := "abcdefghijklmnopqrstuvwxyz"
* broj := 26

* Naša dodatna latinična slova
*           "ŠšĐđČčĆ掞"

 string := "ŠšĐđČčĆ掞"
 broj := 10


nn:=len(string)

for i=1 to broj
    znak:=substr(string,i,1)
    hex:=StrToHex(znak)
    aadd(aHex,hex)
next i

STAMPAJ()

RETURN NIL

FUNCTION STAMPAJ()

* LOCAL ctxt := ctxt()
  LOCAL ctxt := c:\hexcode.txt
DELETE FILE (ctxt)
SET PRINTER TO (ctxt)
SET PRINT ON
SET CONSOLE OFF
SET MARGIN TO 2

? " "
for i=1 to broj
    ? aHex[i]
next i
? " "

SET PRINTER TO
SET PRINT OFF
SET CONSOLE ON
SET MARGIN TO 0
* LISTAJ(ctxt,,.f.)
  RunShell(ctxt,“notepad.exe“)

RETURN NIL

Zadnja izmena 25.07.2019
BAST Open Source Project

Slobodan Stanojević Coba, dipl.ing.