hr znakovi, normalizacija i unicode

125 views
Skip to first unread message

Aljosa Mohorovic

unread,
Oct 19, 2011, 10:13:22 AM10/19/11
to Python Hrvatska
zna netko zbog cega se đ ne pretvara u d ili nesto trece?

>>> s = u"čćžšđ-ČĆŽŠĐ"
>>> unicodedata.normalize("NFKD", s)
-> u'c\u030cc\u0301z\u030cs\u030c\u0111-C\u030cC\u0301Z\u030cS\u030c
\u0110'

>>> unicodedata.normalize("NFKD", s).encode('ascii', 'ignore')
-> 'cczs-CCZS'

konkretno vezano za django, django.template.defaultfilters#slugify
koristi normalize i radi ok za čćžš, ali ne za đ.

imam rjesenje za moj problem, ali me vise zanima neka povijest/razlog
ovog problema ili je to bug?

Aljosa

Vedran Krivokuca

unread,
Oct 19, 2011, 10:15:18 AM10/19/11
to pyth...@googlegroups.com
2011/10/19 Aljosa Mohorovic <aljosa.m...@gmail.com>:

> zna netko zbog cega se đ ne pretvara u d ili nesto trece?
>

Funny typo fact: 'Đ' je dio osnovnog latin seta :-)

http://en.wikipedia.org/wiki/D_with_stroke

Latin
Đ was used in Medieval Latin to mark abbreviations of words containing
the letter d. For example, hđum could stand for heredum "of the
heirs". Similar strokes were added to other letters to form
abbreviations.[4]

--
Pozdrav / Greetings, Vedran Krivokuća <vkriv...@gmail.com>

Non bene pro toto libertas venditur auro.

Matko Jun

unread,
Oct 19, 2011, 10:16:02 AM10/19/11
to pyth...@googlegroups.com
http://stackoverflow.com/questions/2362810/why-doesnt-get-flattened-to-d-when-removing-accents-diacritics

i mene je to dugo mučilo...

2011/10/19 Aljosa Mohorovic <aljosa.m...@gmail.com>



--
Matko Jun

M1:
091 1739 564
M2:
091 6327 377

W1: http://www.cephalea.net
W2: http://www.digress.me


Aljoša Mohorović

unread,
Oct 19, 2011, 10:20:20 AM10/19/11
to pyth...@googlegroups.com
2011/10/19 Matko Jun <matk...@gmail.com>:

> i mene je to dugo mučilo...

a mene sad muci, ako je dio osnovnog latin seta, zasto onda nestane,
tj. zar ne bi onda treba ostati nepromijenjen?

Senko Rasic

unread,
Oct 20, 2011, 10:25:13 AM10/20/11
to Python Hrvatska
Đ je možda u osnovnom Latin setu, ali nije u ASCII-u, a pretpostavljam
da onaj 'ignore' znači da samo odignorira znakove koji nisu u ASCII
setu.

Pozdrav,
Senko

On Oct 19, 4:20 pm, Aljoša Mohorović <aljosa.mohoro...@gmail.com>
wrote:
> 2011/10/19 Matko Jun <matko....@gmail.com>:

Dalen

unread,
Oct 22, 2011, 6:22:18 PM10/22/11
to Python Hrvatska
Tocno, nije u ASCII, ali je u ASCII extended (do 256 - cp1252, latin,
WE).

Onaj normalize() radi tocno sto se od njega trazi, i tamo postoji d
tj. D (u unicode-u).
Metoda encode() ga pojede iz nekih cudnih razloga.

Ako stavite normalize(...).encode("cp1252", "ignore")
Umjesto d se pojavljuju neki cudni char-ovi iz dna ASCII-a.
(mozete onda probati .replace() :D [ja nebih])
ISO standardi se isto tako ponasaju.

Pretpostavljam da encode() radi nesto tipa ovo:

>>> s = normalize(...)
>>> news = ""
>>> for x in s:
... news += chr(ord(x)%128) # moze i 256
...
>>>

U ovom algoritmu se d spusti na ASCII 16, a D na 17. Ostalo prodje
kako Bog zapovjeda.

Ako se ne varam, u pitanju je bio obican unicode, mozda bi utf-8
rijesio problem.

Dalen
P.S. Meni u shell-u u Cygwin-u Python interpreter radi tocno sto vama
treba.
Ako ukucam đ on upise d, i ostale diaklitike tretira na isti
nacin.
To znaci da solucija u library-ju 99% postoji.

Aljoša Mohorović

unread,
Oct 24, 2011, 8:20:54 AM10/24/11
to pyth...@googlegroups.com
2011/10/23 Dalen <dber...@gmail.com>:

> (mozete onda probati .replace()   :D  [ja nebih])

nebi ja puno stvari radio pa na kraju ipak ispadne jedino prakticno
rjesenje to sta ja nebi..

Reply all
Reply to author
Forward
0 new messages