2014-09-27 19 views
8

In che modo la stringa Unicode viene rappresentata letteralmente nella memoria di Python?In che modo unicode è rappresentato internamente in Python?

Ad esempio, è possibile visualizzare 'abc' come equivalenti byte ASCII in memoria. L'intero potrebbe essere pensato come la rappresentazione del complimento del 2. Tuttavia u'\u2049', anche se è rappresentato in UTF-8 come '\xe2\x81\x89' - 3 byte di lunghezza, come si visualizza il letterale u'\u2049' codepoint nella memoria?

C'è un modo specifico in cui è memorizzato? Python 2 e Python 3 lo trattano diversamente?

domande Poche correlati per chiunque sia curioso:

1) How are these strings represented internally in Python interpreter ? I don't understand

2) What is internal representation of string in Python 3.x

risposta

10

Python 2 e Python 3.0-3.2 uso sia UCS2 * o UCS4 per i caratteri unicode, il che significa che 'O utilizzare 2 byte o 4 byte per ogni carattere. Quale viene scelto è un'opzione in fase di compilazione.

\u2049 è quindi rappresentato sia come \x49\x20 o \x20\x49 o \x49\x20\x00\x00 o \x00\x00\x20\x49 a seconda del byte order nativo del vostro sistema e se UCS2 o UCS4 è stato scelto. I caratteri ASCII in una stringa unicode usano ancora 2 o 4 byte per carattere.

Python 3.3 è passato a una nuova rappresentazione interna, utilizzando la forma più compatta necessaria per rappresentare tutti i caratteri di una stringa. Vengono scelti 1 byte, 2 byte o 4 byte. Il testo ASCII e Latin-1 utilizza solo 1 byte per carattere, il resto dei caratteri BMP richiede 2 byte e dopo viene utilizzato 4 byte.

Vedere PEP-393: Flexible String Representation per il menu a discesa completo su queste rappresentazioni.


* Tecnicamente build UCS-2 utilizza UTF-16, come caratteri non BMP usano UTF-16 surrogati per codificare a 4 byte (2 UTF-16 caratteri ciascuna). Tuttavia, la documentazione Python si riferisce ancora a questo come UCS2.

Ciò comporta un comportamento imprevisto, ad esempio len(), su stringhe Unicode non BMP più lunghe del numero di caratteri contenuti.

+2

Per sapere se si dispone di una build "narrow" (UCS2) o "wide" (UCS4), esaminare sys.maxunicode. 65535 significa stretto, 1114111 significa ampio. –

+0

Penso che tecnicamente, sia UTF-16 o UTF-32, non UCS2 o UCS4, poiché le coppie surrogate vengono utilizzate in build strette, rendendolo UTF-16. –

+0

@NedBatchelder: in effetti, non sono sicuro del motivo per cui la documentazione si attenga ancora all'utilizzo di UCS. –

Problemi correlati