Portál AbcLinuxu, 1. května 2024 20:11


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Vložit další komentář
13.2.2007 00:54 Kyosuke | skóre: 28 | blog: nalady_v_modre
Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 7 (řetězce 3)
Odpovědět | Sbalit | Link | Blokovat | Admin
Je to divný, ale ten maketrans s češtinou mi s UTF-16 funguje. ;-) Zjevně i Pythonu nějaký ten krůček do úplné unicodizace chybí. Za modul unicodedata budiž ovšem had blahoslaven a veleben. :-)
Jak moc jsou ábíčkáři inteligentní? ;-)
13.2.2007 10:48 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 7 (řetězce 3)
Jestli mohu doporučit, tak funkcím maketrans/translate je dobré se vyhnout, pokud si opravdu nejste naprosto jistí, že je opravdu potřebujete. Tyto funkce pracují s jednotlivými bajty (nikoli znaky), což se moc nehodí při práci s utf-8 a při práci s textem obecně. Jestliže ten maketrans s češtinou fungoval, byla to náhoda. A pokud nefungoval, nebyla to chyba pythonu ;-)

Pro překódování řetězce odněkud někam je lepší použít encode/recode. Pro "hádání" kódování slouží Yetiho enca se svým pythonovským modulem pyenca. Pro odstranění diakritiky lze využít výše zmíněný modul unicodedata.

Jo a díky za pěkný článek!
13.2.2007 11:57 Kyosuke | skóre: 28 | blog: nalady_v_modre
Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 7 (řetězce 3)
Takhle nějak?
def deaccent(unistr):
    return "".join(aChar 
                   for aChar in unicodedata.normalize("NFD", unistr) 
                   if "COMBINING" not in unicodedata.name(aChar))
13.2.2007 12:01 Kyosuke | skóre: 28 | blog: nalady_v_modre
Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 7 (řetězce 3)
Á, odpovím si sám:
def deaccent(unistr):
    return "".join(aChar 
                   for aChar in unicodedata.normalize("NFD", unistr) 
                   if not unicodedata.combining(aChar))
bude očividně mnohem rychlejší. :-) Budu si ten modul muset prostudovat. :-D
13.2.2007 13:28 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 7 (řetězce 3)
Vida, díky - tvůj postup naprosto precizně odstraní akcenty :-) Zkusil jsem si s tím taky pohrát a dostal jsem se do svízele s tím, že vlastně nechápu, k čemu se to vlastně používá. Má to smysl možná tehdy, když musí být výsledkem ascii řetězec, a pak pouhé odstranění akcentů nestačí. Zde je ukázka několika možností:
#!/usr/bin/env python
#coding: utf-8

import unicodedata

def deaccent(unistr):
    return "".join(aChar 
                   for aChar in unicodedata.normalize("NFD", unistr) 
                   if not unicodedata.combining(aChar))
                   
old_cz = u'áÁčČďĎěĚéÉíÍňŇóÓřŘšŠťŤúÚůŮýÝžŽ'
old_fr = u'ôœùûüÿàâçéèêëïîÔŒÙÛÜŸÀÂÇÉÈÊËÏÎ'
old = old_cz + old_fr
print old
print deaccent(old)
print deaccent(old).encode('ascii', 'replace')
print deaccent(old).encode('ascii', 'ignore')
print unicodedata.normalize('NFKD', old).encode('ascii', 'ignore')
print unicodedata.normalize('NFKD', old).encode('ascii', 'replace')
Výsledek je toto:
áÁčČďĎěĚéÉíÍňŇóÓřŘšŠťŤúÚůŮýÝžŽôœùûüÿàâçéèêëïîÔŒÙÛÜŸÀÂÇÉÈÊËÏÎ
aAcCdDeEeEiInNoOrRsStTuUuUyYzZoœuuuyaaceeeeiiOŒUUUYAACEEEEII
aAcCdDeEeEiInNoOrRsStTuUuUyYzZo?uuuyaaceeeeiiO?UUUYAACEEEEII
aAcCdDeEeEiInNoOrRsStTuUuUyYzZouuuyaaceeeeiiOUUUYAACEEEEII
aAcCdDeEeEiInNoOrRsStTuUuUyYzZouuuyaaceeeeiiOUUUYAACEEEEII
a?A?c?C?d?D?e?E?e?E?i?I?n?N?o?O?r?R?s?S?t?T?u?U?u?U?y?Y?z?Z?
 o??u?u?u?y?a?a?c?e?e?e?e?i?i?O??U?U?U?Y?A?A?C?E?E?E?E?I?I?
Jak je vidět, s češtinou celkem není problém, a proto pro ni lze na netu najít tolik více či méně korektních postupů. Ale zkusil jsem francouzštinu a pro ascii reprezentaci by to ještě chtělo spravit ty ligatury.
13.2.2007 13:41 Kyosuke | skóre: 28 | blog: nalady_v_modre
Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 7 (řetězce 3)
Tak s těmi ligaturami bacha, ono v některých jazycích je to plnohodnotné písmeno, takže jakékoli odstraňování čehokoliv je locale-dependent. ;-)
13.2.2007 14:47 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 7 (řetězce 3)
Aha, máš pravdu:
>>> import unicodedata
>>> unicodedata.name(u'Œ')
'LATIN CAPITAL LIGATURE OE'
>>> unicodedata.name(u'Æ')
'LATIN CAPITAL LETTER AE'
Konverze do ASCII (nebo spíš latin-1?) by IMHO locale-dependent být nemusela. Ale nejsem si jistý. Za přečtení stojí tohleto: http://effbot.org/zone/unicode-convert.htm Uf. Radši akcenty nikdy neodstraňovat.
13.2.2007 15:21 Kyosuke | skóre: 28 | blog: nalady_v_modre
Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 7 (řetězce 3)
Mnojo, jazykověda je ještě lepší zábava než linuxový kernel. :-D ;-)
13.2.2007 15:43 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 7 (řetězce 3)
Hehe :-) A když už jsme u těch akademických debat, zdá se, že pro převod do ASCII se při normalizaci víc hodí parametr 'NFKD' (místo 'NFD'), přestože ničí část informace. Například:
>>> ctvrtka = u'\N{VULGAR FRACTION ONE QUARTER}'
>>> print unicodedata.normalize('NFKD', ctvrtka)
1⁄4
>>> print unicodedata.normalize('NFD', ctvrtka)
¼
Bohužel, někteří často pomocí skriptů převádějí do ASCII názvy souborů a adresářů. Takže když bude v názvu jedna čtvrtina, vyrobí se z toho nadbytečné lomítko, které v cestě nadělá paseku. No teoreticky by se to stát mohlo, no ne? :-)
13.2.2007 15:47 Kyosuke | skóre: 28 | blog: nalady_v_modre
Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 7 (řetězce 3)
Diskuse se začíná nebezpečně stáčet směrem k založení nového projektu na Sourceforgi. :-D

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.