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?
risposta
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).
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. –
@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
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. –
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.
"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. –
- 1. byte UTF8 [] per conversione stringhe
- 2. PHP preg_split utf8 caratteri
- 3. Rimozione dei caratteri NULL dai byte
- 4. È possibile che php rilevi i caratteri utf8 codificati a 4 byte?
- 5. Conversione dei caratteri UTF8 fuoriusciti nella loro forma originale
- 6. Java/clojure: delimitatore di caratteri multipli e mantenere il delimitatore
- 7. primefaces fileupload filtro con filtro utf8 caratteri
- 8. Confronta i valori dei byte?
- 9. Perché esistono i byte? Perché non usiamo solo bit?
- 10. _T() modifiche macro per i dati dei caratteri UNICODE
- 11. MySQL - Convertire i caratteri latin1 su un tavolo UTF8 in UTF8
- 12. Java string.split - da delimitatore a più caratteri
- 13. Hibernate/JPA import.sql utf8 caratteri corrotti
- 14. Esistono API per i prezzi dei servizi Web Amazon?
- 15. string.split - con delimitatore a più caratteri
- 16. Ottieni QString in byte (non caratteri)
- 17. Esistono convenzioni per l'ordinazione dei metodi Java?
- 18. Regex per rimuovere caratteri non alfanumerici da stringhe UTF8
- 19. Codifica UTF8 Java
- 20. PostgreSQL + PHP + UTF8 = sequenza di byte non valida per la codifica
- 21. Errore Postgres su insert - ERRORE: sequenza byte non valida per la codifica "UTF8": 0x00
- 22. Qual è la differenza tra i set di caratteri utf8mb4 e utf8 in mysql?
- 23. Libreria C per convertire i punti codice unicode in UTF8?
- 24. Caratteri non alfanumerici di striscia dall'inglese UTF8 + stringa inglese
- 25. java utf8 codifica - char, i tipi di stringa
- 26. Sottostringa o carattere Metodo per stringhe UTF8 con 2+ byte in JAVA
- 27. bug Java? Perché extra zero byte nella codifica utf8?
- 28. Esistono metodi incorporati in Java per aumentare le dimensioni dei caratteri?
- 29. Lettura caratteri speciali da Byte []
- 30. Come rimuovere 4 byte utf-8 caratteri in Ruby?
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. –
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? –
@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. –