C'è un buon delimitatore a byte singolo da usare con le stringhe utf-8 che non è un terminatore nullo?

1

Sto cercando un modo rapido per dividere stringhe contenenti singoli payload JSON. Attualmente sto usando le newline e sto cercando il carattere ASCII di nuova riga, ma immagino che se comincio a usare utf-8 questo potrebbe facilmente rompersi.

Esiste un carattere a singolo byte veloce che sarei in grado di usare oltre a un terminatore nullo che posso usare per dividere stringhe in modo che non venga eliminato da utf-8 o visualizzato nel payload JSON?

    
posta Mikey A. Leonetti 21.02.2017 - 20:11
fonte

2 risposte

8

UTF-8 è stato specificamente progettato per essere compatibile con le versioni avanti e indietro con ASCII, in particolare ha queste due proprietà:

  • la codifica dei caratteri all'interno del set di caratteri ASCII è la stessa in UTF-8 come in ASCII
  • tutti gli altri codepoint sono codificati come una sequenza di 2-6 ottetti, ognuno dei quali ha il loro bit di ordine più alto (8 bit); poiché ASCII utilizza solo 7 bit e ha sempre l'8 ° bit non impostato, un carattere ASCII a ottetto singolo non può mai essere scambiato per una parte di una sequenza multi-ottetto e viceversa

Quindi, supponendo che le nuove linee funzionino in modo affidabile per te che usi ASCII, funzioneranno anche in modo affidabile usando UTF-8.

Dovrai gestire diverse convenzioni di nuova linea di diversi sistemi operativi, accettando tutto \r\n (DOS, Windows), \r (Classic MacOS) e \n (Unix), o specificando uno e uno solo (gli standard Internet utilizzano tutti \r\n , perché sono trattati come una nuova riga da tutti i sistemi operativi, con forse un po 'di ulteriore garbage allegato). E questo non prende nemmeno in considerazione i vari caratteri di nuova riga non ASCII definiti in Unicode.

Tuttavia, c'è un problema: i newline sono caratteri validi in JSON; possono apparire tra due token e vengono ignorati come spazi bianchi

AFAICS, non è così facile trovare un personaggio che non può apparire in JSON. Le specifiche sono un po 'vaghe, si parla di "spazio bianco" permesso, ma non specifica cosa significhi realmente "spazio bianco".

Un modo per aggirare questo problema consiste nel racchiudere i documenti JSON in un elenco JSON, essenzialmente rendendo gli oggetti JSON solo elementi di un array JSON esterno.

Un altro modo sarebbe passare a una lingua diversa: dalla versione 1.2, YAML è un superset di JSON appropriato, il che significa che ogni documento JSON valido è anche un documento YAML valido. Una delle caratteristiche che YAML ha che JSON no, è un marcatore di fine documento che consente di inserire più documenti nello stesso puntatore. Pertanto, se inserisci un indicatore di fine documento YAML tra i tuoi documenti JSON, hai uno stream valido composto da più documenti YAML.

    
risposta data 21.02.2017 - 20:43
fonte
4

Se non appare nel tuo payload, qualsiasi carattere ASCII a byte singolo è un separatore valido, perché i punti (ASCII) del codice 0 - 127 saranno unici, nessun byte singolo sfuggito abbinare i loro valori.

Vedi Wikipedia su UTF-8 .

I punti di codice

Single Byte (ASCII) saranno sempre codificati come 0xxxxxxx bit, mentre tutti i byte di sequenze saranno codificati come 1xxxxxxx bit.

Quindi, il tuo byte di interruzione di riga ( 0x0A / dec 10 / bin 00001010 ) può comparire solo se in realtà esiste un feed di riga.

    
risposta data 21.02.2017 - 20:23
fonte

Leggi altre domande sui tag