Unicode - ★★ Fog Developer ★★

Novo

6/recent/ticker-posts

Unicode

12.4 Unicode 

Ja nisam, do sada imao nikakvih problema sa pisanjem i korišćenjem naših (ne-engleskih) slova u Python programima, a za to postoje dva razloga: koristim operativni sistem koji ima podrazumevanu podršku za naša slova, i koristim Python3, koji sam po sebi ima podrazumevanu podršku za međunarodne oznake. Ali, sve to može lako da padne u vodu, naročito ako bih ja bio korisnik Windows operativnog sistema, gde je, vrlo lako moguće napraviti kolaps, naročito prilikom čitanja ili pisanja u fajlovima, gde se koriste ne-engleske oznake. Ako želim da budem siguran da će sve oznake koje koristim u svom programu, moći pravilno da se prikažu na bilo kom računaru, i bilo kom operativnom sistemu, poželjno bi bilo da koristim unicode tip stringova, koji se definiše tako što se, neposredno pre stringa postavi oznaka u (kao skraćenica od unicode):
>>> mama = 'Pozdrav' 
>>> tata = u' svima!' 
>>> mama + tata 
'Pozdrav svima!' 
>>> type(mama) 
<class 'str'> 
>>> type(tata) 
<class 'str'> 
>>> 
Vidimo da su i jedna i druga promenljiva klase stringova, ali....
>>> sin = u' \u2119\u01b4\u2602\u210c\xf8\u1f24' 
>>> print(mama + tata + '\nŽeli ti ' + sin + ' !') 
Pozdrav svima! 
Želi ti  ℙƴ☂ℌøἤ ! 
>>> type(sin) 
<class 'str'> 
>>> sin 
' ℙƴ☂ℌøἤ' 
>>> 
Ne treba da te buni način na koji sam predstavio reč Python, to su samo oznake koje predstavljaju karaktere pomoću kojih je lepo napisana ova reč. Naravno da ne treba da ih znaš, već da ih pronađeš i koristiš samo po potrebi. Ovaj primer, ukoliko si korisnik operativnog sistema Windows, treba da radiš unutar Python shell-a koji je ugrađen u IDLE, ili da koristiš neki terminal emulator koji podržava standard UTF-8, u suprotnom, ako koristiš PowerShell ili cmd prompt, teško da ćeš dobiti ovakav rezultat.
U suštini treba zapamtiti da se unicode tip stringova koristi u slučajevima kada se koriste neke specijalne oznake, ili oznake koje nisu standardne za engleski jezik.
Na slici je prikazana greška koja može da nastane prilikom pokretanja Python programa koji u sebi sadrži unikod oznake, koristeći Windows PowerShell. Čak i ako je podešen font za prikaz oznaka, sam operativni sistem će da izbaci grešku! Zbog toga je pametnije koristiti neki shell koji podržava UTF-8 enkoding, kao što je npr Python prompt unutar IDLE-a, što je prikazano na sledećoj slici.
Na slici vidimo da kada koristimo prompt u IDLE-u, ni u Windowsu više nije problem da se radi sa unikode oznakama!
Međutim, prava glavobolja nastaje prilikom rada sa fajlovima, ili prilikom rada sa internet resursima. Na internetu je, skoro pa, standardan format koji se naziva „UTF-8“, i na žalost, najčešće nije podrazumevan na većini operativnih sistema koje „obični“ korisnici upotrebljavaju, a kao široko rasprostranjen format, UTF-8 bi smo trebali da koristimo i pri čitanju i pisanju fajlova koji sadrže ne-engleske oznake. Ovo se lako postiže, jer funkciji open() koja nam služi za rad sa fajlovima možemo da prosledimo jedan zgodan argument, koji ću ti pokazati na primeru skripte koja radi u utf-8 enkondingu, sačuvaj kao unikode.py:
#!/usr/bin/env python3 
# encoding=utf-8 

'''Скрипта која ради са УТФ-8 знацима.''' 

fajl = open('Мој фајл.txt', 'w', encoding='utf-8') 
fajl.write('Човек је богат онолико колико зна.\nA ako zna mnogo načina da kaže, ili napiše, jednu te istu stvar\n-Onda je on "тешка буржоазија"!\nA ako i ne zna, tu je \u2119\u01b4\u2602\u210c\xf8\u1f24 da mu pomogne.') 
fajl.close() 

moj_tekst = open('Мој фајл.txt', encoding='utf-8').read() 
print(moj_tekst)
Što nam daje izlaz:
./unikode.py 
Човек је богат онолико колико зна. 
A ako zna mnogo načina da kaže, ili napiše, jednu te istu stvar 
-Onda je on "тешка буржоазија"! 
A ako i ne zna, tu je ℙƴ☂ℌøἤ da mu pomogne. 
Kako ovo, u stvari, funkcioniše?
Da bi smo se osigurali da Python prepozna da u našem programu koristimo oznake koje nisu standardne za naš operativni sistem, na vrhu našeg programa stavljamo komentar # encoding=utf-8. Zapamti jednu stvar: ovaj komentar MORA da se nalazi na prvoj ili drugoj liniji unutar naše skripte, jer jedino u tom slučaju Python zna da je u pitanju „specijalan“ komentar, koji nije namenjen samo čitaocima programa, već i njemu, lično!
Postoje više načina da se ova linija napiše, najčešće ćeš je sretati kao:
# -*- encoding : utf-8 -*-
Ali, ponekad je dosta i:
# utf-8
i Python će da zna šta je u pitanju.
Takođe, gotovo je obavezna stavka da, kada želimo da koristimo fajl koji sadrži neke unikod oznake, u funkciju open() prosleđujemo argument encoding="utf-8".
Budući da je unikod tema koja izaziva glavobolje, ostavljam ti da je sam proučiš, i to u Pythonovoj dokumentaciji ili na ovoj zanimljivoj lokaciji.

12.3 Pickle Indeks 12.5 Rezime

Постави коментар

0 Коментари