Domanda

Mi sono imbattuto in questo passaggio nel Tutorial su Django:

I modelli Django hanno un valore predefinito stra() metodo che chiama unicode() e converte il risultato in una stringa di byte UTF-8.Ciò significa che unicode(p) restituirà una stringa Unicode e str(p) restituirà una stringa normale, con caratteri codificati come UTF-8.

Ora, sono confuso perché afaik Unicode non è una rappresentazione particolare, quindi cos'è una "stringa Unicode" in Python?Significa UCS-2?Ho cercato su Google questo "Tutorial Python Unicode" che afferma coraggiosamente

Unicode è una codifica a due byte che copre tutti i sistemi di scrittura più comuni al mondo.

il che è semplicemente sbagliato, o no?Molte volte sono stato confuso dal set di caratteri e dai problemi di codifica, ma qui sono abbastanza sicuro che la documentazione che sto leggendo sia confusa.Qualcuno sa cosa succede in Python quando mi dà una "stringa Unicode"?

È stato utile?

Soluzione

cos'è una "stringa Unicode" in Python?Significa UCS-2?

Le stringhe Unicode in Python vengono archiviate internamente come UCS-2 (rappresentazione a 16 bit a lunghezza fissa, quasi uguale a UTF-16) o UCS-4/UTF-32 (rappresentazione a 32 bit a lunghezza fissa).È un'opzione in fase di compilazione;su Windows è sempre UTF-16 mentre molte distribuzioni Linux impostano UTF-32 ("wide mode") per le loro versioni di Python.

Generalmente non dovresti preoccuparti:vedrai i punti di codice Unicode come singoli elementi nelle tue stringhe e non saprai se sono memorizzati come due o quattro byte.Se utilizzi una build UTF-16 e devi gestire caratteri al di fuori del piano multilingue di base, lo farai in modo sbagliato, ma è comunque molto raro e gli utenti che hanno davvero bisogno di caratteri extra dovrebbero compilare build ampie.

semplicemente sbagliato, o no?

Sì, è del tutto sbagliato.Ad essere onesti, penso che il tutorial sia piuttosto vecchio;probabilmente è antecedente alle stringhe Unicode larghe, se non a Unicode 3.1 (la versione che ha introdotto caratteri al di fuori del piano multilingue di base).

Esiste un'ulteriore fonte di confusione derivante dall'abitudine di Windows di utilizzare il termine "Unicode" per indicare, in particolare, la codifica UTF-16LE utilizzata internamente da NT.Le persone di Microsoftland possono spesso copiare questa abitudine un po' fuorviante.

Altri suggerimenti

Nel frattempo ho fatto una ricerca raffinata per verificare quale sia la rappresentazione interna in Python, e anche quali siano i suoi limiti."La verità su Unicode in Python" è un ottimo articolo che cita direttamente gli sviluppatori Python.Apparentemente, la rappresentazione interna è UCS-2 o UCS-4 a seconda di un'opzione in fase di compilazione.Quindi Jon, non è UTF-16, ma la tua risposta mi ha messo comunque sulla strada giusta, grazie.

Python memorizza Unicode come UTF-16.str() restituirà la rappresentazione UTF-8 della stringa UTF-16.

Da Wikipedia su UTF-8:

UTF-8 (formato di trasformazione UCS/Unicode a 8 bit) è un codifica dei caratteri a lunghezza variabile per Unicode.È in grado di rappresentare qualsiasi carattere nello standard Unicode, tuttavia la codifica iniziale dei codici byte e delle assegnazioni di caratteri per UTF-8 è retrocompatibile con ASCII.Per questi motivi, sta diventando sempre più la codifica preferita per la posta elettronica, le pagine Web[1] e altri luoghi in cui i caratteri vengono archiviati o trasmessi in streaming.

Quindi, è compreso tra uno e quattro byte a seconda del carattere che desideri rappresentare nel regno di Unicode.

Da Wikipedia su Unicode:

Nell'informatica, Unicode è uno standard industriale che consente ai computer di rappresentare e manipolare in modo coerente il testo espresso in formato la maggior parte dei sistemi di scrittura del mondo.

Quindi è in grado di rappresentare la maggior parte (ma non tutti) dei sistemi di scrittura del mondo.

Spero che aiuti :)

Allora cos'è una "stringa unicode" in Python?

Python "sa" che la tua stringa è Unicode.Quindi se esegui regex su di esso, saprà qual è il carattere e quale non lo è ecc., il che è davvero utile.Se hai fatto uno strlen, darà anche il risultato corretto.Ad esempio, se hai eseguito il conteggio delle stringhe su Hello, otterrai 5 (anche se è Unicode).Ma se hai fatto un conteggio delle stringhe di una parola straniera e quella stringa non era una stringa Unicode, otterrai un risultato molto più grande.Pythong utilizza le informazioni del database dei caratteri Unicode per identificare ciascun carattere nella stringa Unicode.Spero che aiuti.

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