2009-07-12 11 views
19

È considerata una buona pratica scegliere la stringa Unicode su una stringa normale durante la codifica in Python? Principalmente lavoro sulla piattaforma Windows, dove oggigiorno la maggior parte dei tipi di stringhe sono Unicode (cioè .NET String, '_UNICODE' attivato per impostazione predefinita su un nuovo progetto C++, ecc.). Pertanto, tendo a pensare che il caso in cui vengano utilizzati oggetti stringa non Unicode sia una specie di caso raro. Ad ogni modo, sono curioso di sapere cosa fanno i pitonisti nei progetti del mondo reale.Devo usare la stringa Unicode per impostazione predefinita?

risposta

17

Dalla mia pratica - utilizzare unicode.

All'inizio di un progetto usavamo tutte le nostre stringhe, tuttavia il nostro progetto stava crescendo, stavamo implementando nuove funzionalità e utilizzando nuove librerie di terze parti. In quel pasticcio con stringhe non Unicode/Unicode alcune funzioni hanno iniziato a fallire. Abbiamo iniziato a passare del tempo a localizzare questi problemi e a risolverli. Tuttavia, alcuni moduli di terze parti non supportano l'unicode e hanno iniziato a fallire dopo che siamo passati ad esso (ma questa è un'esclusione piuttosto che una regola).

Inoltre, ho una certa esperienza quando è necessario riscrivere alcuni moduli di terze parti (ad esempio SendKeys) perché non supportano l'Unicode. Se è stato fatto in unicode dall'inizio sarà meglio :)

Quindi penso che oggi dovremmo usare unicode.

P.S. Tutto ciò che è pasticciato è solo la mia opinione scomoda :)

+2

+1: utilizzare sempre unicode quando si gestisce il testo. Ogni volta che si presenta la necessità di trattare i dati di testo come byte (ad esempio quando si sposta su una rete o si scrive su disco), converti l'unicode in una sequenza di byte (rappresentata come una stringa in Python). Converti chiamando la codifica o l'unicode. – codeape

2

Se si ha a che fare con memoria o spazio su disco gravemente limitato, utilizzare stringhe ASCII. In questo caso, dovresti scrivere anche il tuo software in C o qualcosa di ancora più compatto :)

13

Mentre poni questa domanda, suppongo tu stia usando Python 2.x.

Python 3.0 è cambiato parecchio nella rappresentazione di stringhe e tutto il testo ora è unicode.
Vorrei unicode in qualsiasi nuovo progetto, in un modo compatibile con il passaggio a Python 3.0 (vedere details).

+0

Sì, la compatibilità futura è abbastanza importante! –

4

In aggiunta al commento Mihails Direi: Usa Unicode, poiché è il futuro. In Python 3.0, Non Unicode sarà scomparso, e per quanto ne so, tutti i "U" -Prefixes creeranno problemi, dal momento che sono spariti.

5

Può essere difficile utilizzare in modo coerente le stringhe Unicode in Python 2.x - sia perché qualcuno utilizza inavvertitamente il più naturale str(blah) dove intendevano unicode(blah), dimenticando il prefisso u sulle stringhe letterali, incompatibilità modulo di terze parti - qualunque cosa. Quindi in Python 2.x, usa unicode solo se necessario, e sei pronto a fornire una buona copertura del test unitario.

Se si ha la possibilità di utilizzare Python 3.x, tuttavia, non è necessario preoccuparsi: le stringhe saranno unicode senza sforzi aggiuntivi.

13

Sì, utilizzare unicode.

Alcuni indizi:

  1. Nel fare ingresso uscita in qualsiasi tipo di formato binario, decodificare direttamente dopo aver letto e codificare direttamente prima di scrivere, in modo che mai bisogno di mescolare stringhe e Unicode. Perché il mixaggio tende a portare a UnicodeEncodeDecodeErrors prima o poi.

  2. [Dimentica questo, le mie spiegazioni mi hanno reso ancora più confuso. È solo un problema quando si esegue il porting su Python 3, quindi ci si può preoccupare.]

  3. Comune errori newbie Python con Unicode (non dicendo che sei un principiante, ma questo può essere letto dai principianti): Non confondere la codifica e la decodifica. Ricorda, UTF-8 è una codifica ENCode, quindi inserisci ENcode Unicode in UTF-8 e DEcode da esso.

  4. Non cadere nella tentazione di impostare la codifica predefinita in Python (tramite setdefaultencoding in sitecustomize.py o simile) a qualsiasi cosa tu usi di più. Questo ti darà problemi se reinstallerai o ti trasferisci su un altro computer o improvvisamente hai bisogno di usare un'altra codifica. Sii esplicito.

  5. Ricordate, non tutta la libreria standard di Python 2 accetta unicode. Se si alimenta un metodo unicode e non funziona, ma dovrebbe, provare ad alimentarlo ascii e vedere. Esempi: urllib.urlopen(), che fallisce con errori inutili se gli dai un oggetto unicode invece di una stringa.

Hm. Questo è tutto quello che posso pensare ora!

+0

Il punto 3 è così vero: tutti quelli che conosco (incluso me) hanno commesso questo errore, e non solo una volta! –

+1

Ri: "codifica direttamente dopo la scrittura" - puoi chiarire? Penso che dovrebbe essere "prima" anziché "dopo", ma potrei mancare il tuo punto. – ars

+0

@Lennart: "Si noti che anche se dopo si codifica unicode in una stringa piena di testo non ascii, questo è ancora testo, secondo Python." ... In 3.x, str.encode() restituisce i byte di tipo e la distinzione ascii o non sembra irrilevante; qual è il punto che stai cercando di fare? –

Problemi correlati