Perché la codifica / decodifica Unicode è necessaria in JavaScript

0

Mi chiedo perché la codifica unicode sia necessaria in JavaScript. Sto guardando utf8.js come esempio. Sto anche esaminando la specifica di utf8 , ma non sto seguendo realmente le diverse parti di dati. Inoltre, non capisco quando e dove dovresti codificare / decodificare, e quale sia il formato "corrente" di alcuni set di byte in un linguaggio di programmazione, quindi è difficile seguire questo.

UTF-8’s encoder’s handler, given a stream and code point, runs these steps:...

Vorrei sapere che cos'è lo stream e che cos'è il code point . Comprendo che i punti di codice sono caratteri, che in utf8 potrebbero essere composti da più unità di codice a 8 bit.

Vorrei anche sapere in generale perché non si può semplicemente avere in una lingua "unicode", e non esiste codifica / decodifica utf8 / utf16, perché è già nel formato utf8. Questo mi fa chiedere se JavaScript debba eseguire questa codifica / decodifica per qualche motivo, come forse perché JavaScript usa la codifica utf16, e quindi il flusso di bit che passi a utf8.js è un flusso di bit codificati utf16. O forse non è così, e invece il flusso di bit che passi a utf8.js è un flusso di x ( qualcos'altro ) come la codifica decimale o qualsiasi altra cosa possa significare.

Non sono sicuro di quale sia il formato / codifica dei byte in arrivo, e anche perché abbiamo bisogno di fare la conversione. Ad esempio, in qui quando menzionano la "Buffer class is ... raw binary data" (in Node.js), non sono sicuro di cosa significhi quel dato binario non elaborato. Forse questo significa che è UTF16, ed è per questo che forse dovrebbe essere convertito in UTF8, non ne sono sicuro. E quando questo indica JSON.parse non esegue alcuna decodifica di stringa, comincio a chiedermi se questo significa che JSON.parse assume la codifica UTF16, o forse assume la codifica UTF8, non ne sono sicuro. La ricerca della "codifica JSON.parse utilizza" non rivela nulla.

    
posta Lance Pollard 23.07.2018 - 23:45
fonte

2 risposte

2

I punti codice sono spesso caratteri, ma potrebbero essere altre cose, come caratteri di controllo (ritorno a capo, ecc.), spazi bianchi o accenti. I punti di codice possono essere rappresentati da numeri a 21 bit da 0 a 1FFFFF.

Unicode ha iniziato a utilizzare 16 bit per punto di codice (da 0 a FFFF), ma piuttosto a corto di punti di codice e ha dovuto aumentare a 21 bit. Quindi l'idea di usare solo un numero a 16 bit per un punto di codice doveva essere scartata.

Ora abbiamo finito con tre diverse codifiche.

UTF-32 calcola appena i 21 bit in un numero a 32 bit. È semplice ma spreca molto spazio.

UTF-16 sono i vecchi caratteri a 16 bit, ma con un bodge in cui alcuni caratteri sono riservati, e attaccare due dei riservati insieme crea un carattere a 21 bit. Per peggiorare le cose, UTF-16 è disponibile nelle versioni big-endian e little-endian.

UTF-8 è stato inventato come un modo semplice e pulito per comprimere Unicode in modo efficiente. Utilizza tra 1 e 4 byte per punto di codice. Con un design intelligente, i caratteri ASCII sono anche caratteri UTF-8 da 1 byte.

Quindi è necessaria la codifica per convertire i punti di codice Unicode a 21 bit in una serie di byte a 8 bit in formato UTF-8. La sequenza di byte che ottieni dopo averli codificati è lo stream.

Il termine "stream" implica che puoi trattarlo come una serie di byte e non preoccuparti di cosa sono finché non arrivi al punto in cui devi decodificarli di nuovo.

    
risposta data 24.07.2018 - 17:40
fonte
6

I am not sure what raw binary data means.

Significa che nulla qui è sicuro di cosa significhi.

Se alzo due dita, dico 2, V per la vittoria o il segno di pace?

Conoscere la codifica ti consente di conoscere il significato dietro il simbolo. Senza sapere la codifica tutto ciò che sai è che sto tenendo due dita. Quando si elaborano dati senza conoscere la codifica, il significato, si tratta di dati binari non elaborati.

Il vocabolario che usiamo per questo è strano. Sembriamo ciò che è cambiato solo perché lo comprendiamo. Ma sto tenendo le stesse dita indipendentemente da quanto tu capisca.

Ciò che cambia è ciò che puoi fare con esso. Se hai bisogno di dire alla gente quello che sto segnalando e non hanno mai sentito parlare di un segnale di vittoria, potresti mostrare loro un pugno tenuto in alto per celebrare la stessa cosa. Non puoi farlo se non sai cos'è un segno di vittoria. Tutto quello che puoi fare è dire "sta alzando due dita".

Proviamo a fare un esercizio. Se tengo 5 dita in una mano e 2 in un'altra, potresti presumere che intendo 7. Potresti avere ragione. Ma se mi vedi contare da 0 a 5 sulla mia mano destra, allora tieni premuto 1 alla mia sinistra solo per contare ancora da 0 a 5 alla mia destra e poi tieni premuto 2 alla mia sinistra, beh potresti presumere che sto contando per 5 di.

Sono le stesse dita. Ma come pensi a loro cambia ciò che intendono.

ASCII è un modo per pensare ai bit. UTF-8 è un altro. Il raw binario è un modo per pensare ai bit che dicono "Non ho idea, lascia che qualcos'altro capisca cosa significa. Devo solo riportare quello che vedo".

    
risposta data 24.07.2018 - 03:21
fonte

Leggi altre domande sui tag