È 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
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 :)
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 :)
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).
Sì, la compatibilità futura è abbastanza importante! –
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.
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.
Sì, utilizzare unicode.
Alcuni indizi:
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.
[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.]
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.
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.
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!
Il punto 3 è così vero: tutti quelli che conosco (incluso me) hanno commesso questo errore, e non solo una volta! –
Ri: "codifica direttamente dopo la scrittura" - puoi chiarire? Penso che dovrebbe essere "prima" anziché "dopo", ma potrei mancare il tuo punto. – ars
@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? –
- 1. Devo impostare Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture per impostazione predefinita nella mia app?
- 2. Devo supportare Unicode nelle password?
- 3. Come posso usare la chiave stringa Unicode nell'oggetto Javascript?
- 4. Fare Go usare il compilatore Int64 per impostazione predefinita
- 5. Impostazione AutoEventWireup = "false" per impostazione predefinita
- 6. RadioButtonList selezionata per impostazione predefinita
- 7. Perché dichiarare unicode per stringa in python?
- 8. MySql - La chiave primaria è unica per impostazione predefinita?
- 9. phpmyadmin: impostazione predefinita per la struttura anziché la ricerca
- 10. Serve file statico index.html per impostazione predefinita
- 11. Devo usare string.isEmpty() o "" .equals (stringa)?
- 12. Blocco Ottimistico in Hibernate per impostazione predefinita
- 13. Django-tastypie. Uscita in JSON al browser per impostazione predefinita
- 14. Impostazione della didascalia Unicode da una stringa DLL DLL Tabella
- 15. Impostazione predefinita derby.system.home
- 16. Devo usare promessa per mkdir
- 17. Vagrant non protetto per impostazione predefinita?
- 18. Parametro array, vuoto per impostazione predefinita
- 19. Testo sublime 2: nascondi la minimappa per impostazione predefinita
- 20. Google Maps apre la finestra informativa per impostazione predefinita?
- 21. Come deselezionare la casella di spunta per impostazione predefinita sempre
- 22. Come mantenere compressa la Fisarmonica UI jQuery per impostazione predefinita?
- 23. La proprietà è presunta atomica per impostazione predefinita
- 24. Arresta Datagrid selezionando la prima riga per impostazione predefinita
- 25. dizionario Python che per impostazione predefinita è la chiave?
- 26. Perché Android Webview non verifica la cache per impostazione predefinita?
- 27. Precaricamento delle associazioni Ecto per impostazione predefinita
- 28. SVN Tortoise Commit deselezionare per impostazione predefinita
- 29. Perché DoubleBuffered è disattivato per impostazione predefinita?
- 30. Java Unicode per stringa esadecimale
+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