¿Cuál es la diferencia entre codificación y juego de caracteres?

151

Estoy confundido acerca de la codificación de texto y el juego de caracteres. Por muchas razones, tengo que aprender cosas no Unicode, no UTF8 en mi próximo trabajo.

Encuentro la palabra "charset" en los encabezados de los correos electrónicos como en "ISO-2022-JP", pero no existe tal codificación en los editores de texto. (Miré a los diferentes editores de texto).

¿Cuál es la diferencia entre la codificación de texto y el juego de caracteres? Le agradecería que me mostrara algunos ejemplos de casos de uso.

TK
fuente
Ver esta publicación: stackoverflow.com/questions/13743250/…
rghome

Respuestas:

144

Básicamente:

  1. charset es el conjunto de caracteres que puedes usar
  2. la codificación es la forma en que estos caracteres se almacenan en la memoria
Svetlozar Angelov
fuente
42
Es cierto, pero en el uso real "charset" generalmente se refiere tanto al repertorio de caracteres como al esquema de codificación.
Alan Moore
@AlanMoore De hecho, casi de la misma manera que la gente dice "número decimal" para referirse a cualquier número con un "separador decimal". No es realmente correcto, pero sí, debes tener en cuenta que algunas personas lo usan así.
bvdb
2
Eso no es exactamente correcto. Por ejemplo, Unicode se refiere al conjunto de caracteres, pero existen múltiples codificaciones posibles (UTF-8, UTF-16, UTF-32).
rghome
84

Cada codificación tiene un conjunto de caracteres particular asociado, pero puede haber más de una codificación para un conjunto de caracteres dado. Un juego de caracteres es simplemente lo que parece, un conjunto de personajes. Hay una gran cantidad de conjuntos de caracteres, incluidos muchos destinados a secuencias de comandos o idiomas particulares.

Sin embargo, estamos avanzando en la transición a Unicode, que incluye un conjunto de caracteres capaz de representar casi todos los scripts del mundo. Sin embargo, hay múltiples codificaciones para Unicode. Una codificación es una forma de asignar una cadena de caracteres a una cadena de bytes. Los ejemplos de codificaciones Unicode incluyen UTF-8 , UTF-16 BE y UTF-16 LE . Cada uno de estos tiene ventajas para aplicaciones particulares o arquitecturas de máquinas.

Matthew Flaschen
fuente
20
Tenga en cuenta que javadoc usa incorrectamente "charset" en lugar de "encoding", por ejemplo, en InputStreamReader , leemos "Un InputStreamReader es un puente de secuencias de bytes a secuencias de caracteres: lee bytes y los decodifica en caracteres usando un conjunto de caracteres especificado. su uso puede especificarse por nombre o puede proporcionarse explícitamente, o puede aceptarse el juego de caracteres predeterminado de la plataforma ". . Sin embargo, lo que quieren decir es "codificar".
David Tonhofer
44
Gracias por tu explicación. Unicode es un conjunto de caracteres, y UTF-8 es una forma de codificación de Unicode , y UTF-16 es otra forma de codificación de Unicode .
HongchaoZhang
47

Además de las otras respuestas, creo que este artículo es una buena lectura http://www.joelonsoftware.com/articles/Unicode.html

El artículo se titula " El mínimo absoluto que todo desarrollador de software debe saber absolutamente, positivamente sobre los conjuntos de caracteres y Unicode (¡sin excusas! " ) Escrito por Joel Spolsky . El ensayo tiene más de 10 años pero (desafortunadamente) el contenido sigue siendo válido ...

mattanja
fuente
2
Muchas gracias por presentar el artículo. Que es una buena idea.
TK.
9
Esta respuesta podría mejorarse dando una breve explicación de por qué debería leer el artículo de Joel.
james.garriss
@mattanja El enlace que proporcionó es realmente genial. Gracias por compartir. Votado
hagrawal
1
También quiero poner este gran artículo que es un apéndice de Joel Spolsky's; kunststube.net/encoding
mkb
No entendí el artículo de Joel en mi primera lectura. Más bien encontré que este powerpoint es mucho más claro y específico: unicode.org/notes/tn23/Muller-Slides+Narr.pdf
johnsimer
27

Una codificación de caracteres consta de:

  1. El conjunto de caracteres admitidos.
  2. Un mapeo entre caracteres y enteros ("puntos de código")
  3. Cómo se codifican los puntos de código como una serie de "unidades de código" (por ejemplo, unidades de 16 bits para UTF-16)
  4. Cómo se codifican las unidades de código en bytes (por ejemplo, big-endian o little-endian)

El Paso # 1 en sí mismo es un "repertorio de caracteres" o "conjunto de caracteres" abstracto, y # 1 + # 2 = un "conjunto de caracteres codificado".

Pero antes de que Unicode se hiciera popular y todos (excepto los asiáticos del este) usaran una codificación de un solo byte, los pasos # 3 y # 4 eran triviales (punto de código = unidad de código = byte). Por lo tanto, los protocolos más antiguos no distinguían claramente entre "codificación de caracteres" y "conjunto de caracteres codificados". Los protocolos más antiguos se usan charsetcuando realmente significan codificación.

dan04
fuente
¿sería por eso que podemos leer charset = 'utf-8' en la etiqueta META html? porque se definió hace mucho tiempo
Eildosa
26

Al arrojar más luz para las personas que visitan en adelante, espero que sea útil.


Conjunto de caracteres

Hay caracteres en cada idioma y la colección de esos caracteres forma el "conjunto de caracteres" de ese idioma. Cuando se codifica un carácter, se le asigna un identificador único o un número llamado como punto de código. En la computadora, estos puntos de código estarán representados por uno o más bytes.

Ejemplos de conjunto de caracteres: ASCII (cubre todos los caracteres en inglés), ISO / IEC 646, Unicode (cubre caracteres de todos los idiomas vivos del mundo)

Conjunto de caracteres codificados

Un conjunto de caracteres codificados es un conjunto en el que se asigna un número único a cada carácter. Ese número único se llama "punto de código".
Los juegos de caracteres codificados a veces se denominan páginas de códigos.

Codificación

La codificación es el mecanismo para mapear los puntos de código con algunos bytes para que un carácter pueda leerse y escribirse uniformemente en diferentes sistemas usando el mismo esquema de codificación.

Ejemplos de codificación: esquemas de codificación ASCII, Unicode como UTF-8, UTF-16, UTF-32.

Elaboración de los 3 conceptos anteriores.

  • Considere esto: el carácter 'क' en el juego de caracteres Devanagari tiene un punto de código decimal de 2325 que estará representado por dos bytes ( 09 15) cuando se usa la codificación UTF-16
  • En el esquema de codificación "ISO-8859-1", "ü" (esto no es más que un carácter en el conjunto de caracteres latinos) se representa como un valor hexadecimal de FCmientras que en "UTF-8" se representa como C3 BCy en UTF-16 comoFE FF 00 FC .
  • Diferentes esquemas de codificación pueden usar el mismo punto de código para representar diferentes caracteres, por ejemplo, en “ISO-8859-1” (también llamado como Latin1), el valor del punto de código decimal para la letra 'é' es 233. Sin embargo, en ISO 8859-5 , el mismo punto de código representa el carácter cirílico 'щ'.
  • Por otro lado, un único punto de código en el conjunto de caracteres Unicode puede asignarse a diferentes secuencias de bytes, dependiendo de la codificación utilizada para el documento. El carácter Devanagari क, con el punto de código 2325 (que es 915 en notación hexadecimal), estará representado por dos bytes cuando se utiliza la codificación UTF-16 ( 09 15), tres bytes con UTF-8 ( E0 A4 95) o cuatro bytes con UTF-32 ( 00 00 09 15)
hagrawal
fuente
11

Un conjunto de caracteres, o repertorio de caracteres, es simplemente un conjunto (una colección desordenada) de caracteres. Un conjunto de caracteres codificados asigna un número entero (un "punto de código") a cada carácter del repertorio. Una codificación es una forma de representar puntos de código inequívocamente como una secuencia de bytes.

Jonathan Feinberg
fuente
Esta debería ser la respuesta aceptada. Define claramente tres conceptos: conjunto de caracteres, conjunto de caracteres codificados y codificación.
Marcus Junius Brutus
6

Buscado en Google para ello. http://en.wikipedia.org/wiki/Character_encoding

La diferencia parece ser sutil. El término charset en realidad no se aplica a Unicode. Unicode pasa por una serie de abstracciones. caracteres abstractos -> puntos de código -> codificación de puntos de código a bytes.

Los charsets realmente omiten esto y saltan directamente de caracteres a bytes. secuencia de bytes <-> secuencia de caracteres

En resumen, codificación: puntos de código -> bytes juego de caracteres: caracteres -> bytes

Fakrudeen
fuente
5

Un juego de caracteres es solo un conjunto; contiene, por ejemplo, el símbolo del euro, o no lo tiene. Eso es todo.

Una codificación es un mapeo biyectivo de un conjunto de caracteres a un conjunto de enteros. Si admite el símbolo del euro, debe asignar un número entero específico a ese carácter y a ningún otro.

Kilian Foth
fuente
¿Tiene que ser biyectivo?
Jörg W Mittag
2
Bueno, la codificación y la decodificación deben ser deterministas, por lo que realmente no puede haber ninguna asignación ambigua. Supongo que podría tener un conjunto de números enteros no contiguos como codominio, pero eso desperdiciaría espacio cuando almacena texto, y los ingenieros odian el espacio desperdiciado.
Kilian Foth
1
Las codificaciones de caracteres heredados a menudo no son biyectivas. Por ejemplo, en IBM437, tanto ß como β están representados por 0xE1.
dan04
3

En mi opinión, un conjunto de caracteres es parte de una codificación (un componente), la codificación tiene un atributo de conjunto de caracteres, por lo que un conjunto de caracteres se puede utilizar en muchas codificaciones. Por ejemplo, unicode es un juego de caracteres utilizado en codificaciones como UTF-8, UTF-16, etc. Ver ilustración aquí:Ver ilustración aquí

El char en charset no significa el tipo de char en el mundo de la programación, significa un char en el mundo real, en inglés puede ser el mismo, pero en otros idiomas no, como el chino, '我' es un 'char' inseparable en los charsets (UNICODE, GB [usado en GBK y GB2312]), 'a' también es un char en charsets (ASCII, ISO-8859 , UNICODE).

Eric Liu
fuente
1

En mi opinión, la palabra "juego de caracteres" debe limitarse a identificar el parámetro utilizado en HTTP, MIME y estándares similares para especificar una codificación de caracteres (una asignación de una serie de caracteres de texto a una secuencia de bytes) por nombre. Por ejemplo:charset=utf-8 .

Sin embargo, soy consciente de que MySQL, Java y otros lugares pueden usar la palabra "charset" para significar una codificación de caracteres.

Peter O.
fuente
1

Una codificación es una asignación entre bytes y caracteres de un conjunto de caracteres, por lo que será útil analizar y comprender la diferencia entre bytes y caracteres. .

Piense en los bytes como números entre 0 y 255, mientras que los caracteres son elementos abstractos como "a", "1", "$" y "Ä". El conjunto de todos los caracteres disponibles se denomina conjunto de caracteres. .

Cada carácter tiene una secuencia de uno o más bytes que se utilizan para representarlo; sin embargo, el número exacto y el valor de los bytes depende de la codificación utilizada y hay muchas codificaciones diferentes.

La mayoría de las codificaciones se basan en un antiguo conjunto de caracteres y codificación llamada ASCII, que es un byte único por carácter (en realidad, solo 7 bits) y contiene 128 caracteres, incluidos muchos de los caracteres comunes utilizados en inglés de EE. UU.

Por ejemplo, aquí hay 6 caracteres en el conjunto de caracteres ASCII que están representados por los valores 60 a 65.

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

En el conjunto ASCII completo, el valor más bajo utilizado es cero y el más alto es 127 (ambos son caracteres de control ocultos).

Sin embargo, una vez que comience a necesitar más caracteres de los que proporciona el ASCII básico (por ejemplo, letras con acentos, símbolos de moneda, símbolos gráficos, etc.), ASCII no es adecuado y necesita algo más extenso. Necesita más caracteres (un conjunto de caracteres diferente) y una codificación diferente, ya que 128 caracteres no son suficientes para todos los caracteres. Algunas codificaciones ofrecen un byte (256 caracteres) o hasta seis bytes.

Con el tiempo se han creado muchas codificaciones. En el mundo de Windows, hay CP1252 o ISO-8859-1, mientras que los usuarios de Linux tienden a favorecer UTF-8. Java usa UTF-16 de forma nativa.

Una secuencia de valores de byte para un carácter en una codificación podría representar un carácter completamente diferente en otra codificación, o incluso podría ser inválido.

Por ejemplo, en la norma ISO 8859-1 , â está representado por un byte de valor 226, mientras que en UTF-8 que es de dos bytes: 195, 162. Sin embargo, en ISO 8859-1 , 195, 162serían dos caracteres, Ã, ¢ .

Cuando las computadoras almacenan datos acerca de los caracteres internamente o los transmiten a otro sistema, almacenan o envían bytes. Imagine que un sistema que abre un archivo o recibe un mensaje ve los bytes195, 162 . ¿Cómo sabe qué personajes son estos?

Para que el sistema interprete esos bytes como caracteres reales (y así los muestre o los convierta a otra codificación), necesita conocer la codificación utilizada. Es por eso que la codificación aparece en los encabezados XML o se puede especificar en un editor de texto. Le dice al sistema la asignación entre bytes y caracteres.

rghome
fuente