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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top