2010-02-23 16 views
9

Se si dispone di un array di byte che contiene il contenuto UTF8, come faccio ad analizzarlo? Ci sono dei byte delimitatore che posso separare per ottenere ogni carattere?Esistono dei byte delimitatore per i caratteri UTF8?

+0

Prestare attenzione a input non validi, assicurarsi che il codice non faccia qualcosa di male come un buffer overflow se una sequenza arriva ad oltre 4 byte, ad esempio. –

+0

Una volta eseguito il prelievo dei bit necessario, si ottiene un gruppo di caratteri da 1 a 4 byte; cosa hai intenzione di fare con quello? Perché non lo decodifichi e lavori sui caratteri Unicode risultanti? –

+0

@JohnMachin nel mio caso, il "grappolo di caratteri" è troppo grande per essere elaborato in un colpo solo, e il mio codice cerca un offset di byte sicuro per suddividere i dati in blocchi più piccoli che possono essere lavorati singolarmente. –

risposta

13

Date un'occhiata qui ...

http://en.wikipedia.org/wiki/UTF-8

Se stai cercando di individuare il confine tra i personaggi, quello che serve è nella tabella "Descrizione".

L'unico modo per ottenere un bit zero elevato è il sottoinsieme ASCII 0..127, codificato in un singolo byte. Tutti i codepoint non ASCII hanno 2 byte in poi con "10" nei due bit più alti. Il byte principale di un punto di codice non ha mai questo - i suoi bit alti indicano il numero di byte, ma c'è una certa ridondanza - si può ugualmente guardare il byte successivo che non ha il "10" per indicare il prossimo punto.

0xxxxxxx : ASCII 
10xxxxxx : 2nd, 3rd or 4th byte of code 
11xxxxxx : 1st byte of code, further high bits indicating number of bytes 

Un codepoint in Unicode non è necessariamente uguale a un carattere. Ad esempio, ci sono dei codepoint di modifica (come gli accenti).

+0

E riguardo le sequenze di variazione delle emoji? Ad esempio, se il carattere 'U + 1F469' (in binario' 11110000 10011111 10010001 10101001') è a parte, si ottiene l'emoji "donna". Tuttavia se è seguito da 'U + 1F3FD' (in binario' 11110000 10011111 10001111 10111101'), allora sarà una donna con la pelle marrone. Come si può rilevare in sicurezza questo limite per evitare di rompere utf-8 byte tra i due? Entrambi i codepoint sono validi (l'ultimo è reso come un quadrato marrone su OS X), ma gli utenti non si aspetterebbero che vengano scissi. –

+0

@AbhiBeckert - stai pensando al livello sbagliato. UTF-8 non definisce né interessa il modo in cui le sequenze dei codepoint Unicode sono correlate tra loro. Innanzitutto, si converte UTF-8 (o altre codifiche) in un flusso Unicode, quindi lo interpreti. Non conosco i dettagli specifici di Unicode, ma un approccio generale al problema della gestione dei codepoint dei modificatori equivale a riconoscere le parole chiave e altri token in un tokenizzatore di linguaggio di programmazione. Probabilmente esiste un modo più specifico per Unicode ma non lo so e, in ogni caso, dovresti fare una domanda a parte. – Steve314

+0

Sto cercando di identificare "il confine tra i personaggi", dove un "personaggio" è un singolo glifo disegnato sullo schermo, che è esattamente la domanda a cui stai rispondendo per quanto posso vedere.Sto suddividendo una grande quantità (potenzialmente gigabyte) di dati utf-8 in pezzi più piccoli (decine di byte di lunghezza) che sono disegnati sullo schermo individualmente, e questo si romperà silenziosamente se i byte sono separati come suggerisci nel tuo risposta. –

0

I byte che hanno il primo bit impostato su 0 sono caratteri ASCII normali. I byte che hanno il loro primo bit impostato su 1 fanno parte di un carattere UTF-8.

Il primo byte in ogni carattere UTF-8 ha il suo secondo bit impostato su 1, in modo che il byte abbia i bit più significativi 11. Ogni seguente byte appartenente allo stesso carattere UTF-8 inizia invece con 10.

Il primo byte di ciascun carattere UTF-8 indica inoltre quanti dei seguenti byte appartengono al carattere, in base al numero di bit impostati su 1 nei bit più significativi di quel byte.

Per ulteriori dettagli, vedere Wikipedia page per UTF-8.

+0

"UTF-8 character" è un termine improprio. Sembra che tu ti stia riferendo a una sequenza di 2-4 byte che rappresenta un carattere non ASCII. Quando si tratta di comprendere Unicode, credo che ottenere il vocabolario giusto sia metà della battaglia. –

Problemi correlati