Domanda

Ho una stringa in unicode e ho bisogno di restituire i primi N caratteri. Sto facendo questo:

result = unistring[:5]

, ma, naturalmente, la lunghezza delle stringhe Unicode! = Lunghezza dei caratteri. Qualche idea? L'unica soluzione sta usando Re?

Modifica: Maggiori informazioni

unistring = "Μεταλλικα" #Metallica written in Greek letters
result = unistring[:1]

RITORNI a>?

Credo che le stringhe Unicode sono due byte (char), è per questo che questa cosa accade. Se faccio:

result = unistring[:2]

ho

M

che è corretto, Quindi, dovrei sempre affettare * 2 o dovrei convertire in qualcosa?

È stato utile?

Soluzione

Purtroppo per ragioni storiche prima di Python 3.0 ci sono due tipi di stringhe. stringhe byte (str) e stringhe Unicode (unicode ) .

Prima della unificazione in Python 3.0 ci sono due modi per dichiarare una stringa letterale:. unistring = "Μεταλλικα" che è una stringa di byte e unistring = u"Μεταλλικα" che è una stringa unicode

La ragione che si vede ? quando fate result = unistring[:1] è perché alcuni dei caratteri nel testo Unicode non possono essere rappresentati correttamente nella stringa non Unicode. Probabilmente avete visto questo tipo di problema, se mai usato un veramente vecchio client di posta elettronica e ha ricevuto email da amici in paesi come la Grecia, per esempio.

Quindi, in Python 2.x se è necessario gestire Unicode bisogna farlo in modo esplicito. Date un'occhiata a questa introduzione a trattare con Unicode in Python: Unicode HOWTO

Altri suggerimenti

Quando si dice:

unistring = "Μεταλλικα" #Metallica written in Greek letters

non hanno una stringa unicode. Si dispone di un bytestring a (presumibilmente) UTF-8. Che non è la stessa cosa. Una stringa unicode è un tipo di dati separata in Python. Si ottiene unicode decodificando stringhe di byte utilizzando la codifica a destra:

unistring = "Μεταλλικα".decode('utf-8')

o utilizzando l'unicode letterale in un file sorgente con la dichiarazione di codifica destra

# coding: UTF-8
unistring = u"Μεταλλικα"

La stringa unicode farà ciò che si vuole quando si fa unistring[:5].

Non c'è corretto approccio straight-forward con qualsiasi tipo di "stringa Unicode".

Anche Python "Unicode" UTF-16 stringa ha caratteri di lunghezza variabile quindi, non si può semplicemente tagliare con ustring [: 5]. Poiché alcuni punti di codice Unicode possono utilizzare più di una "personaggio" ovvero coppie surrogate.

Quindi, se si vuole tagliare 5 punti codice (notare queste non sono caratteri ) così si può analizzare il testo, vedere http://en.wikipedia.org/wiki/UTF-8 e http://en.wikipedia.org/wiki/UTF-16 definizioni. Quindi è necessario utilizzare alcune maschere di bit per capire i limiti.

Inoltre è ancora non si ottiene caratteri. Perché per esempio. Parola "שָלוֹם" - la pace in ebraico "Shalom" si compone di 4 caratteri e 6 del codice punti lettera "shin", vocale "a" lettera "lamed", la lettera "VAV" e vocale "o" e finale "Mem" lettera.

carattere non è punto codice .

Lo stesso vale per la maggior parte delle lingue occidentali, dove una lettera con segni diacritici può essere rappresentato come due punti di codice. Cerca per esempio per "normalizzazione Unicode".

Quindi ... Se davvero bisogno di 5 primi caratteri è necessario utilizzare strumenti come libreria ICU. Per esempio c'è libreria ICU per Python che fornisce caratteri di confine iteratore.

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