[Python] Domanda su unicode

Marco Giusti marco.giusti a posteo.de
Gio 5 Mar 2015 12:51:15 CET


On Thu, Mar 05 2015, Walter Valenti wrote:
> python 2.7
> 
> Ho il seguente:
> import locale, datetime
> locale.setlocale(locale.LC_ALL,'it_IT.UTF-8')
> now = datetime.datetime.now().strftime("%Y-%m-%d %A %H:%M:%S")
> 
> now è viene restituito di tipo "str". 
> 
> Se cerco di convertirlo in unicode,
> mediante unicode(now) mi da un errore
> UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3
> dovuto alla 'ì'.
> 
> Come faccio a farmi restituire uno 'unicode'?

Bella domanda, provo a risponderti ma con un grosso punto interrogativo
alla fine, perché non sono sicuro della correttezza della risposta.
Spero che qui nella lista confermino o smentiscano quanto dico.

1. Tu setti il locale come costante. Benché possa funzionare nei
sistemi di tuo interesse, non è una buona pratica. Meglio è lasciare che
ciascuno scelga il proprio locale e usare quello. LA documentazione
riporta: Normalmente gli applicativi iniziano con una chiamata del tipo:

    import locale
    locale.setlocale(locale.LC_ALL, "")

Questo perché, se qualcuno non ha installato il locale in questione, si
ritroverà con un bel messaggio di errore.

2. Quando hai una stringa devi decodificarla dal locale corrente, per
poter avere un oggetto di tipo unicode:

    nowu = unicode(now, curlocale)
    nowu = now.decode(curlocale)

3. Come fai a determinare il locale corrente? Per quando io ne sappia ci
sono tre modi e non sono sicuro di quale sia quello giusto.

    locale.getdefaultlocale()[1]
    locale.getpreferredencoding()
    sys.stdin.encoding

Questo è quanto riporta il mio sistema. Come vedi i tre risultati sono
uguali:

    >>> sys.stdin.encoding
    'UTF-8'
    >>> locale.getpreferredencoding()
    'UTF-8'
    >>> locale.getdefaultlocale()
    ('it_IT', 'UTF-8')
    >>> 

m.


Maggiori informazioni sulla lista Python