Qual è la differenza tra codifica e set di caratteri?


151

Sono confuso riguardo alla codifica e al set di caratteri del testo. Per molte ragioni, devo imparare cose non Unicode, non UTF8 nel mio prossimo lavoro.

Trovo la parola "set di caratteri" nelle intestazioni delle e-mail come in "ISO-2022-JP", ma non esiste una tale codifica negli editor di testo. (Ho guardato intorno ai diversi editor di testo.)

Qual è la differenza tra la codifica del testo e il set di caratteri? Ti sarei grato se potessi mostrarmi alcuni esempi di casi d'uso.


Risposte:


144

Fondamentalmente:

  1. charset è l'insieme di caratteri che è possibile utilizzare
  2. la codifica è il modo in cui questi caratteri vengono archiviati nella memoria

42
Vero, ma nell'uso reale "charset" di solito si riferisce sia al repertorio dei personaggi sia allo schema di codifica.
Alan Moore,

@AlanMoore In effetti, più o meno allo stesso modo in cui le persone dicono "numero decimale" per riferirsi a qualsiasi numero con un "separatore decimale". Non è proprio corretto, ma sì, dovresti essere consapevole che alcune persone lo usano in questo modo.
bvdb,

2
Non è esattamente giusto. Ad esempio, Unicode fa riferimento al set di caratteri, ma ci sono più possibili codifiche (UTF-8, UTF-16, UTF-32).
rghome,

84

Ogni codifica ha un set di caratteri particolare associato, ma può esserci più di una codifica per un determinato set di caratteri. Un set di caratteri è semplicemente quello che sembra, un insieme di personaggi. Esistono numerosi set di caratteri, inclusi molti che sono destinati a script o lingue particolari.

Tuttavia, siamo sulla buona strada nel passaggio a Unicode, che include un set di caratteri in grado di rappresentare quasi tutti gli script del mondo. Tuttavia, ci sono più codifiche per Unicode. Una codifica è un modo per associare una stringa di caratteri a una stringa di byte. Esempi di codifiche Unicode includono UTF-8 , UTF-16 BE e UTF-16 LE . Ognuno di questi presenta vantaggi per applicazioni particolari o architetture di macchine.


20
Si noti che javadoc utilizza erroneamente "charset" anziché "codifica", ad esempio in InputStreamReader , leggiamo "Un InputStreamReader è un ponte da flussi di byte a flussi di caratteri: legge byte e li decodifica in caratteri utilizzando un set di caratteri specificato. utilizza può essere specificato per nome o può essere dato in modo esplicito oppure è possibile accettare il set di caratteri predefinito della piattaforma. " . Tuttavia, ciò che significano è "codifica".
David Tonhofer,

4
Grazie per la tua spiegazione. Unicode è un set di caratteri e UTF-8 è un modo di codifica di Unicode e UTF-16 è un altro modo di codifica di Unicode .
HongchaoZhang,

47

Oltre alle altre risposte, penso che questo articolo sia una buona lettura http://www.joelonsoftware.com/articles/Unicode.html

L'articolo è intitolato " Il minimo assoluto che ogni sviluppatore di software deve assolutamente conoscere positivamente su Unicode e set di caratteri (senza scuse!) " Scritto da Joel Spolsky . Il saggio ha più di 10 anni ma (purtroppo) il contenuto è ancora valido ...


2
Grazie mille per aver introdotto l'articolo. Si tratta di un buon compromesso.
TK.

9
Questa risposta potrebbe essere migliorata dando una breve spiegazione del perché dovrei leggere l'articolo di Joel.
james.garriss,

@mattanja Il link che hai fornito è davvero fantastico. Grazie per la condivisione. Votato.
hagrawal,

1
Voglio anche mettere questo fantastico articolo che è in qualche modo un'appendice di Joel Spolsky; kunststube.net/encoding
mkb

Non ho capito l'articolo di Joel alla mia prima lettura. Piuttosto ho trovato questo powerpoint molto più chiaro e specifico: unicode.org/notes/tn23/Muller-Slides+Narr.pdf
johnsimer

27

Una codifica dei caratteri è composta da:

  1. Il set di caratteri supportati
  2. Una mappatura tra caratteri e numeri interi ("punti di codice")
  3. Come i punti di codice sono codificati come una serie di "unità di codice" (ad esempio, unità a 16 bit per UTF-16)
  4. Come le unità di codice sono codificate in byte (ad es. Big-endian o little-endian)

Il passaggio n. 1 da solo è un "repertorio di caratteri" o un "set di caratteri" astratto e # 1 + # 2 = un "set di caratteri codificati".

Ma prima che Unicode diventasse popolare e tutti (tranne gli asiatici orientali) utilizzavano una codifica a byte singolo, i passaggi n. 3 e n. 4 erano banali (code point = code unit = byte). Pertanto, i protocolli più vecchi non distinguevano chiaramente tra "codifica dei caratteri" e "set di caratteri codificati". I protocolli più vecchi usano charsetquando significano veramente la codifica.


sarebbe perché possiamo leggere charset = 'utf-8' nel tag META html? perché è stato definito molto tempo fa
Eildosa il

26

Gettare più luce per le persone che visitano d'ora in poi, si spera che sarebbe utile.


Set di caratteri

Esistono caratteri in ogni lingua e la raccolta di tali caratteri costituisce il "set di caratteri" di quella lingua. Quando un carattere viene codificato, gli viene assegnato un identificatore univoco o un numero chiamato come punto di codice. Nel computer, questi punti di codice saranno rappresentati da uno o più byte.

Esempi di set di caratteri: ASCII (copre tutti i caratteri inglesi), ISO / IEC 646, Unicode (copre i caratteri di tutte le lingue viventi nel mondo)

Set di caratteri codificati

Un set di caratteri codificati è un set in cui è assegnato un numero univoco a ciascun carattere. Quel numero univoco viene chiamato "punto di codice".
I set di caratteri codificati vengono talvolta chiamati pagine di codice.

Codifica

La codifica è il meccanismo per mappare i punti di codice con alcuni byte in modo che un carattere possa essere letto e scritto uniformemente su un sistema diverso usando lo stesso schema di codifica.

Esempi di codifica: ASCII, schemi di codifica Unicode come UTF-8, UTF-16, UTF-32.

Elaborazione di sopra 3 concetti

  • Considera questo: il carattere 'क' nel set di caratteri Devanagari ha un punto decimale di 2325 che sarà rappresentato da due byte ( 09 15) quando si usa la codifica UTF-16
  • Nello schema di codifica "ISO-8859-1" "ü" (questo non è altro che un carattere nel set di caratteri latino) è rappresentato come valore esadecimale di FCmentre in "UTF-8" è rappresentato come C3 BCe in UTF-16 comeFE FF 00 FC .
  • Schemi di codifica diversi possono utilizzare lo stesso punto di codice per rappresentare caratteri diversi, ad esempio in "ISO-8859-1" (chiamato anche come latino1) il valore del punto di codice decimale per la lettera "é" è 233. Tuttavia, in ISO 8859-5 , lo stesso punto di codice rappresenta il carattere cirillico 'щ'.
  • D'altra parte, un singolo punto di codice nel set di caratteri Unicode può effettivamente essere mappato a diverse sequenze di byte, a seconda della codifica utilizzata per il documento. Il carattere Devanagari क, con il punto di codice 2325 (che è 915 in notazione esadecimale), sarà rappresentato da due byte quando si utilizza la codifica UTF-16 ( 09 15), tre byte con UTF-8 ( E0 A4 95) o quattro byte con UTF-32 ( 00 00 09 15)

11

Un set di caratteri, o repertorio di personaggi, è semplicemente un insieme (una raccolta non ordinata) di personaggi. Un set di caratteri codificati assegna un numero intero (un "punto di codice") a ciascun carattere nel repertorio. Una codifica è un modo per rappresentare in modo inequivocabile i punti di codice come un flusso di byte.


Questa dovrebbe essere la risposta accettata. Definisce chiaramente tre concetti: set di caratteri, set di caratteri codificati e codifica.
Marco Junius Bruto

6

Googled per questo. http://en.wikipedia.org/wiki/Character_encoding

La differenza sembra essere sottile. Il termine set di caratteri in realtà non si applica a Unicode. Unicode attraversa una serie di astrazioni. caratteri astratti -> punti di codice -> codifica dei punti di codice in byte.

I set di caratteri in realtà lo saltano e saltano direttamente da caratteri a byte. sequenza di byte <-> sequenza di caratteri

In breve, codifica: punti di codice -> byte set di caratteri: caratteri -> byte


5

Un set di caratteri è solo un set; contiene, ad esempio, il simbolo dell'euro, oppure no. È tutto.

Una codifica è una mappatura biiettiva da un set di caratteri a un set di numeri interi. Se supporta il simbolo dell'euro, deve assegnare un numero intero specifico a quel carattere e a nessun altro.


Deve essere biiettivo?
Jörg W Mittag,

2
Bene, la codifica e la decodifica dovrebbero essere deterministiche, quindi non possono esserci mappature ambigue. Suppongo che potresti avere un insieme non contiguo di numeri interi come codice, ma ciò perderebbe spazio quando conservi il testo e gli ingegneri odiano lo spazio sprecato.
Kilian Foth,

1
Le codifiche dei personaggi legacy spesso non sono biiettive. Ad esempio, in IBM437, sia ß che β sono rappresentati da 0xE1.
dan04,

3

A mio avviso, un set di caratteri fa parte di una codifica (un componente), la codifica ha un attributo charset, quindi un set di caratteri può essere utilizzato in molte codifiche. Ad esempio Unicode è un set di caratteri utilizzato nelle codifiche come UTF-8, UTF-16 e così via. Vedi l'illustrazione qui:Vedi l'illustrazione qui

Il carattere in set di caratteri non significa il tipo di carattere nel mondo della programmazione, significa un carattere nel mondo reale, in inglese forse lo stesso, ma in altre lingue non, come il cinese, '我' è un 'carattere' inseparabile nei set di caratteri (UNICODE, GB [utilizzato in GBK e GB2312]), 'a' è anche un carattere nei set di caratteri (ASCII, ISO-8859 , UNICODE).


1

A mio avviso, la parola "set di caratteri" dovrebbe essere limitata all'identificazione del parametro utilizzato in HTTP, MIME e standard simili per specificare una codifica dei caratteri (una mappatura da una serie di caratteri di testo a una sequenza di byte) per nome. Per esempio:charset=utf-8 .

Sono consapevole, tuttavia, che MySQL, Java e altri luoghi potrebbero usare la parola "set di caratteri" per indicare una codifica dei caratteri.


1

Una codifica è una mappatura tra byte e caratteri da un set di caratteri, quindi sarà utile discutere e comprendere la differenza tra byte e caratteri .

Pensa ai byte come numeri compresi tra 0 e 255, mentre i caratteri sono cose astratte come "a", "1", "$" e "Ä". L'insieme di tutti i caratteri disponibili è chiamato insieme di caratteri .

Ogni personaggio ha una sequenza di uno o più byte che vengono usati per rappresentarlo; tuttavia, il numero esatto e il valore dei byte dipende dalla codifica utilizzata e ci sono molte codifiche diverse.

La maggior parte delle codifiche si basano su un vecchio set di caratteri e codifica chiamata ASCII che è un singolo byte per carattere (in realtà solo 7 bit) e contiene 128 caratteri inclusi molti dei caratteri comuni utilizzati nell'inglese americano.

Ad esempio, qui ci sono 6 caratteri nel set di caratteri ASCII che sono rappresentati dai valori da 60 a 65.

Extract of ASCII Table 60-65
╔══════╦══════════════╗
║ Byte ║  Character   ║
╠══════╬══════════════║
║  60  ║      <       ║
║  61  ║      =       ║
║  62  ║      >       ║
║  63  ║      ?       ║
║  64  ║      @       ║
║  65  ║      A       ║
╚══════╩══════════════╝

Nel set ASCII completo, il valore più basso utilizzato è zero e il più alto è 127 (entrambi sono caratteri di controllo nascosti).

Tuttavia, una volta che inizi a utilizzare più caratteri di quelli forniti dall'ASCII di base (ad esempio lettere con accenti, simboli di valuta, simboli grafici, ecc.), ASCII non è adatto e hai bisogno di qualcosa di più ampio. Sono necessari più caratteri (un set di caratteri diverso) e una codifica diversa poiché 128 caratteri non sono sufficienti per contenere tutti i caratteri. Alcune codifiche offrono un byte (256 caratteri) o fino a sei byte.

Nel tempo sono state create molte codifiche. Nel mondo Windows, esiste CP1252 o ISO-8859-1, mentre gli utenti Linux tendono a preferire UTF-8. Java utilizza UTF-16 in modo nativo.

Una sequenza di valori byte per un carattere in una codifica potrebbe rappresentare un carattere completamente diverso in un'altra codifica o potrebbe anche non essere valida.

Ad esempio, in ISO 8859-1 , â è rappresentato da un byte di valore 226, mentre in UTF-8 è due byte: 195, 162. Tuttavia, in ISO 8859-1 , 195, 162sarebbero due caratteri, Ã, ¢ .

Quando i computer memorizzano i dati sui caratteri internamente o li trasmettono a un altro sistema, archiviano o inviano byte. Immagina che un sistema che apre un file o riceva un messaggio veda i byte 195, 162. Come fa a sapere quali personaggi sono?

Affinché il sistema possa interpretare quei byte come caratteri effettivi (e quindi visualizzarli o convertirli in un'altra codifica), è necessario conoscere la codifica utilizzata. Ecco perché la codifica appare nelle intestazioni XML o può essere specificata in un editor di testo. Indica al sistema la mappatura tra byte e caratteri.

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.