codifiche di stringa in pitone
Domanda
In Python, le stringhe possono essere unicode (sia utf-16 che utf-8) e single-byte con codifiche diverse (cp1251, cp1252 ecc.). È possibile verificare quale stringa di codifica è? Ad esempio,
time.strftime( "%b" )
restituirà una stringa con il nome di testo di un mese. In MacOS la stringa restituita sarà utf-16, in Windows con locale inglese sarà un byte singolo con codifica ASCII e in Windows con locale non inglese sarà codificata tramite la tabella codici locale, ad esempio cp1251. Come posso gestire tali stringhe?
Soluzione
Le stringhe non memorizzano alcuna informazione di codifica, devi solo specificarne una quando converti in / da unicode o stampa su un dispositivo di output:
import locale
lang, encoding = locale.getdefaultlocale()
mystring = u"blabla"
print mystring.encode(encoding)
UTF-8 è non unicode, è una codifica di unicode in stringhe a byte singolo.
La migliore pratica è quella di lavorare con Unicode ovunque sul lato Python, memorizzare le stringhe con una codifica reversibile Unicode come UTF-8 e convertirle in locali fantasiosi solo per l'output dell'utente.
Altri suggerimenti
il rilevamento della codifica dei set di caratteri è molto complesso.
tuttavia, qual è il tuo vero scopo per questo? se vuoi solo valutare di essere in Unicode, scrivi semplicemente
unicode(time.strftime("%b"))
e dovrebbe funzionare per tutti i casi che hai menzionato sopra:
- mac os: unicode (unicode) - > unicode
- win / eng: unicode (ascii) - > unicode
- win / noneng: unicode (some_cp) - > sarà convertito da cp locale - > unicode
Se hai una stringa abbastanza lunga in una codifica sconosciuta, puoi provare a indovinare la codifica, ad es. con Universal Encoding Detector all'indirizzo https://github.com/dcramer/chardet - non infallibile di certo, ma a volte indovina bene ;-). Ma questo non aiuterà molto con stringhe molto brevi.