Perché "charset" significa veramente "codifica" nell'uso comune?

8

Qualcosa che da tempo mi ha confuso è che così tanto software usa i termini "charset" e "encoding" come sinonimi.

Quando le persone si riferiscono a una "codifica" unicode, intendono sempre una serie di regole per rappresentare i caratteri unicode come una sequenza di byte, ad esempio ASCII o UTF-8. Questo sembra ragionevole e intuitivo; l'idea è di "codificare" quei caratteri come byte usando il set di regole specificato.

Dato che questi set di regole a volte forniscono solo la possibilità di "codificare" alcuni sottoinsiemi di tutti i caratteri unicode, potresti immaginare che un "set di caratteri" - abbreviazione di "set di caratteri" - significherebbe semplicemente un set di caratteri unicode - senza alcun riguardo per come questi caratteri sono codificati. Una codifica implicherebbe quindi un charset (una codifica come ASCII, che ha solo regole per codificare 128 caratteri, sarebbe associata al set di caratteri di quei 128 caratteri) ma un set di caratteri non deve implicare una codifica (per esempio, UTF-8, UTF -16 e UTF-32 sono tutte diverse codifiche ma possono codificare lo stesso set di caratteri).

Eppure - ed ecco il punto cruciale della mia domanda - l'uso del mondo reale della parola "charset" non corrisponde a ciò che implicherebbe la costruzione della parola. È quasi sempre usato per "codifica".

Ad esempio:

Quanti anni ha questo curioso (ab) uso del linguaggio, e come è nata questa contro-intuitiva definizione di "charset"? Ha forse origine da un tempo in cui era veramente, in pratica, un mapping uno-a-uno tra le codifiche in uso e gli insiemi di caratteri che supportavano? O c'era qualche standard o specifica particolarmente influente che dettava questa definizione della parola?

    
posta Mark Amery 07.09.2014 - 15:13
fonte

5 risposte

1

Il concetto di set di caratteri è più vecchio di Unicode.

Prima di Unicode, un set di caratteri definiva un insieme di caratteri e come ogni carattere era rappresentato come bit. La maggior parte dei set di caratteri associava un carattere a un byte (che consentiva un set di 256 caratteri), alcuni mappati a due byte e alcuni (come ASCII) a soli 7 bit. Set di caratteri diversi spesso assegnavano valori diversi allo stesso carattere, e non c'era una chiave di traduzione universale tra i vari set di caratteri in uso.

Unicode era un tentativo di risolvere questo problema unificando tutti i vari set di caratteri in un "superset" comune. A tale scopo Unicode ha introdotto alcuni livelli aggiuntivi di astrazione, ad esempio il concetto di carattere codifiche come qualcosa di separato dai valori del punto di codice. Ciò ha consentito a Unicode di ridefinire i set di caratteri pre-unicode come codifiche di caratteri Unicode.

L'attributo charset in HTML (che rispecchia il parametro charset nell'intestazione del tipo di contenuto HTTP), ad esempio, è antecedente all'adozione di unicode, ma quando è stato deciso di accettare unicode come set di caratteri universali di Internet, l'attributo charset è stato appena ridefinito per specificare la codifica in uso, ma il nome non è stato modificato per consentire la compatibilità con le versioni precedenti.

    
risposta data 09.10.2015 - 19:47
fonte
8

Il termine "charset" è ovviamente l'abbreviazione di "character set", che a sua volta è un termine usato per una codifica di caratteri, che può essere interpretata come a) una mappatura tra sequenze di byte e caratteri, b) a mappatura tra numeri interi (numeri di codice) e caratteri o c) una mappatura tra caratteri astratti e numeri interi o sequenze di byte.

"Set di caratteri" è stato utilizzato perché è un'espressione breve e semplice. In esso, "set" ha un significato vago (poiché l'intero concetto è vago), ma in seguito è stato spesso erroneamente interpretato come una raccolta ("set" in senso teorico), come descritto in Dan Connelly (una volta) famoso Set di caratteri considerato dannoso .

L'aspetto più importante è che l'identificatore charset è stato utilizzato in MIME e in HTTP. HTTP 1.0 alias RFC 1945 cita la definizione MIME, "a       metodo utilizzato con una o più tabelle per convertire una sequenza di       ottetti in una sequenza di caratteri "e quindi commenti sulla confusione:" Questo uso del termine 'set di caratteri' è più comunemente       indicato come "codifica dei caratteri". Tuttavia, dal momento che HTTP e       MIME condivide lo stesso registro, è importante la terminologia       anche essere condiviso. "

    
risposta data 07.09.2014 - 19:21
fonte
1

RFC2045 ha introdotto "set di caratteri" in MIME e a quel punto era già chiaro non tutte le codifiche mappato un carattere a un ottetto. RFC2130 tratta questa storia un po 'di più.

In sostanza, "charset" era un termine più popolare quando questi standard venivano scritti, è più succinto di "codifica caratteri" o "schema di codifica testo" e meno ambiguo di "codifica".

    
risposta data 07.09.2014 - 17:03
fonte
1

Ci sono almeno 2 codifiche applicabili al trasferimento di testo. La codifica del personaggio descrive come i caratteri (glifi) sono codificati. Tutte le lingue usano un sottoinsieme del set di caratteri UCS, che sono spesso codificati con un valore di 8 bit. I set di caratteri standardizzati hanno codifiche di caratteri standard e i termini sono generalmente usati in modo intercambiabile.

La codifica del trasferimento descrive come viene trasferito il testo ed è generalmente indipendente dalla codifica dei caratteri. La maggior parte delle codifiche di trasferimento non sono trasparenti e alterano la sequenza di byte trasferita. La codifica del trasferimento a 8 bit è trasparente per le codifiche a 8 bit. La codifica di trasferimento a 7 bit può trasferire solo set di caratteri a 7 bit come ASCII

ASCII utilizza 95 caratteri stampabili e alcuni altri caratteri per il controllo del carrello (avanzamento riga, avanzamento pagina, ritorno a capo, backspace e schede) codificati in 7 bit. Ci sono ulteriori caratteri di controllo usando i valori rimanenti. ASCII è un sottoinsieme appropriato dei set di caratteri UCS e di molti set di caratteri a 8 bit. ISO-8859-1 è anche un sottoinsieme appropriato del set di caratteri UCS, ma questi caratteri hanno una codifica diversa in UTF-8, che utilizza più byte per valori di caratteri superiori a 127.

I mainframe IBM usano (d) l'EBCDID che utilizzava una codifica a 8 bit diversa. Esistono tabelle di traduzione che mappano i caratteri stampabili tra codifiche ASCII e caratteri ECBDIC. ECBDIC ha un set di caratteri più grande di ASCII perché ha segni di punteggiatura non disponibili in ASCII. Ciò potrebbe impedire la completa trasformazione del round trip tra queste due codifiche, se la codifica iniziale è ECBDIC.

Queste codifiche non erano sufficienti per le lingue con caratteri non coperti dai caratteri stampabili ASCII. Microsoft e altri hanno utilizzato estensioni a 8 bit per il set di caratteri ASCII e hanno codificato caratteri aggiuntivi con valori superiori a 127. Una singola estensione non era sufficiente per tutte le lingue poiché queste estensioni aggiungevano solo 96 caratteri al set di caratteri. Ciò ha comportato l'utilizzo di più set di caratteri (set di caratteri) per lingue diverse con codifica di caratteri a 8 bit diversa. Questi set di caratteri includono i caratteri richiesti per quella lingua o famiglia linguistica. I caratteri aggiuntivi possono essere codificati con valori diversi in diversi set di caratteri. È più probabile che gli utenti inglesi lo notino con la punteggiatura estesa (virgolette e trattini sinistra e destra) che vengono visualizzati in modo errato se viene utilizzato un set di caratteri errato. Ciò rende importante conoscere il set di caratteri utilizzato con una codifica di caratteri a 8 bit.

Per le codifiche a byte singolo, solo i caratteri nel set di caratteri possono essere codificati. Alcune lingue richiedevano codifiche multi-byte per coprire il set di caratteri. Il set di caratteri Unicode (UCS) richiede codifiche multibyte per caratteri al di fuori del set di caratteri ASCII. Questo set di caratteri è un superset di tutte le codifiche specifiche della lingua. UTF-8 è una codifica compatta del set di caratteri UCS. ASCII non richiede byte aggiuntivi e la maggior parte (tutti?) Caratteri di lingua europea possono essere codificati come uno o due byte. Il set completo di caratteri UCS-2 può essere codificato in uno o tre byte. Tutti i caratteri nel set di caratteri UCS corrente possono essere codificati da uno a quattro byte.

    
risposta data 08.09.2014 - 05:21
fonte
0

FWIW, IIRC, Tornando al Commodore 64 giorni, un set di caratteri era una funzione da {0, ... 255} al set di tutte le immagini uxv in bianco e nero dove uev era forse 8 e 12. Quindi "cambiare il tuo set di caratteri" significava utilizzando il comando POKE nel linguaggio BASIC per modificare le posizioni di memoria designate per contenere quelle immagini. Ad esempio il codice ASCII 65 significava A e l'immagine di un A sarebbe stata memorizzata a partire dall'indirizzo di memoria a * 65 + b per alcuni b e immagino che a = u * v.

    
risposta data 07.09.2014 - 17:15
fonte

Leggi altre domande sui tag