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
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 – Ć)
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.
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.