Perché "set di caratteri" significa veramente "codifica" nell'uso comune?


10

Qualcosa che mi ha confuso a lungo è che così tanto software utilizza i termini "charset" e "codifica" come sinonimi.

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

Poiché tali set di regole a volte forniscono solo la possibilità di "codificare" un sottoinsieme di tutti i caratteri unicode, si potrebbe immaginare che un "set di caratteri" - abbreviazione di "set di caratteri" - significherebbe semplicemente un set di caratteri unicode - senza alcun riguardo per come quei personaggi sono codificati. Una codifica implicherebbe quindi un set di caratteri (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 (ad esempio UTF-8, UTF -16 e UTF-32 sono tutte codifiche diverse ma possono codificare lo stesso set di caratteri).

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

Per esempio:

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


5
L'uso di charsetprecede lo standard Unicode, quindi anche se potrebbe non essere stato un "mapping uno a uno", i caratteri richiesti per un documento tendevano a forzare la scelta della codifica. Ma non ho tempo di fare ricerche sulla storia attuale della parola ...
AmeliaBR,

2
Parli di set di caratteri come "un set di caratteri Unicode", come se qualcuno avesse iniziato con Unicode e poi avesse scelto dei sottoinsiemi. È più accurato dire che esistevano molti set di caratteri prima dell'invenzione di Unicode (o almeno prima che Unicode diventasse onnipresente) e Unicode è deliberatamente costruito per essere un superset di essi.
John Bartholomew,

Risposte:


3

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

Prima di Unicode, un set di caratteri definiva un set di caratteri e il modo in cui ciascun carattere veniva rappresentato come bit. La maggior parte dei set di caratteri ha mappato un carattere su un byte (che ha consentito un set di 256 caratteri), alcuni mappati su due byte e alcuni (come ASCII) su soli 7 bit. Set di caratteri diversi assegnano spesso valori diversi allo stesso carattere e non esiste 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 tal fine Unicode ha introdotto alcuni livelli aggiuntivi di astrazione, ad esempio il concetto di codifica dei caratteri come qualcosa di separato dai valori dei punti di codice. Ciò ha permesso 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), per esempio, proviene da prima che l'unicode fosse ampiamente adottato, ma quando si decise di accettare Unicode come set di caratteri universale di Internet, l'attributo charset è stato appena ridefinito per specificare la codifica in uso, ma il nome non è stato modificato per consentire la retrocompatibilità.


9

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

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

Ciò che contava di più era che l'identificatore charsetfosse utilizzato in MIME e HTTP. Alias HTTP 1.0 RFC 1945 cita la definizione MIME, "un metodo utilizzato con una o più tabelle per convertire una sequenza di ottetti in una sequenza di caratteri" e quindi commenta la confusione: "Questo uso del termine" set di caratteri "è maggiore comunemente definita "codifica dei caratteri". Tuttavia, poiché HTTP e MIME condividono lo stesso registro, è importante condividere anche la terminologia. "


1

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

In sostanza, "set di caratteri" era un termine più popolare quando venivano scritti quegli standard, è più sintetico di "codifica dei caratteri" o "schema di codifica del testo" e meno ambiguo di "codifica".


Mi sembra che il parametro "charset" fosse già presente in RFC 1341 (giugno 1992).
John Bartholomew,

1

Esistono almeno 2 codifiche applicabili al trasferimento di testo. La codifica dei caratteri descrive come vengono codificati i caratteri (glifi). Tutte le lingue usano un sottoinsieme del set di caratteri UCS, che sono spesso codificati su 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 di 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 da trasferire. La codifica di 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 pochi altri caratteri per il controllo del trasporto (avanzamento riga, avanzamento modulo, ritorno a capo, backspace e tabulazioni) codificato in 7 bit. Esistono caratteri di controllo aggiuntivi che utilizzano i valori rimanenti. ASCII è un sottoinsieme proprio dei set di caratteri UCS e di molti dei set di caratteri a 8 bit. ISO-8859-1 è anche un sottoinsieme corretto del set di caratteri UCS, ma questi caratteri hanno una codifica diversa in UTF-8, che utilizza più byte per valori di carattere superiori a 127.

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

Questa codifica non era sufficiente per le lingue con caratteri non coperti dai caratteri stampabili ASCII. Microsoft e altri hanno usato 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 un massimo di 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 su valori diversi in diversi set di caratteri. È molto probabile che gli utenti inglesi lo notino con punteggiatura estesa (virgolette sinistra e destra e trattini) che vengono visualizzati in modo errato se viene utilizzato il set di caratteri sbagliato.

Per le codifiche a byte singolo è possibile codificare solo i caratteri nel set di caratteri. Alcune lingue richiedono codifiche multi-byte per coprire il loro set di caratteri. Il set di caratteri Unicode (UCS) richiede codifiche multi-byte per caratteri esterni al 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. L'intero set di caratteri UCS-2 può essere codificato in uno o tre byte. Tutti i caratteri nel set di caratteri UCS corrente possono essere codificati in uno o quattro byte.


0

FWIW, IIRC, Back in the Commodore 64 giorni, un set di caratteri era una funzione da {0, ... 255} all'insieme di tutte le immagini in bianco e nero uxv in cui u e v erano forse 8 e 12. Quindi "cambiando il tuo set di caratteri "significava usare 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 una A verrebbe memorizzata a partire dall'indirizzo di memoria a * 65 + b per alcuni b e immagino a = u * v.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.