Portál AbcLinuxu, 1. května 2025 22:37
unicodedata
budiž ovšem had blahoslaven a veleben. def deaccent(unistr): return "".join(aChar for aChar in unicodedata.normalize("NFD", unistr) if "COMBINING" not in unicodedata.name(aChar))
def deaccent(unistr): return "".join(aChar for aChar in unicodedata.normalize("NFD", unistr) if not unicodedata.combining(aChar))bude očividně mnohem rychlejší.
#!/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.
>>> 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.
>>> 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?
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.