Algo que me ha confundido durante mucho tiempo es que tanto software utiliza los términos "charset" y "codificación" como sinónimos.
Cuando las personas se refieren a una "codificación" unicode, siempre se refieren a un conjunto de reglas para representar caracteres unicode como una secuencia de bytes, como ASCII o UTF-8. Esto parece razonable e intuitivo; la idea es que está "codificando" esos caracteres como bytes utilizando el conjunto de reglas especificado.
Dado que esos conjuntos de reglas a veces solo brindan la capacidad de "codificar" algún subconjunto de todos los caracteres unicode, puede imaginarse que un "conjunto de caracteres" - abreviatura de 'conjunto de caracteres' - simplemente significaría un conjunto de caracteres unicode, sin importar cómo esos caracteres están codificados. Por lo tanto, una codificación implicaría un conjunto de caracteres (una codificación como ASCII, que solo tiene reglas para codificar 128 caracteres, estaría asociada con el conjunto de caracteres de esos 128 caracteres) pero un conjunto de caracteres no necesariamente implica una codificación (por ejemplo, UTF-8, UTF -16 y UTF-32 son codificaciones diferentes pero pueden codificar el mismo conjunto de caracteres).
Sin embargo, y aquí está el quid de mi pregunta, el uso en el mundo real de la palabra "charset" no coincide con lo que implicaría la construcción de la palabra. Casi siempre se usa para significar "codificación".
Por ejemplo:
- El
charset
atributo en HTML se usa para especificar una codificación Charset
s en Java son codificacionescharset
sycharacter sets
MySQL son, una vez más, codificaciones
¿Qué edad tiene este curioso (ab) uso del lenguaje, y cómo surgió esta definición contra-intuitiva de 'juego de caracteres'? ¿Acaso se origina en una época en la que realmente existía , en la práctica, un mapeo uno a uno entre las codificaciones en uso y los conjuntos de caracteres que admitían? ¿O hubo algún estándar o especificación particularmente influyente que dictara esta definición de la palabra?
fuente
charset
es anterior al estándar Unicode, por lo que si bien podría no haber sido un "mapeo uno a uno", los caracteres requeridos para un documento tendieron a forzar la elección de la codificación. Pero no tengo tiempo para investigar la historia real de la palabra ...Respuestas:
El concepto de juegos de caracteres es más antiguo que Unicode.
Antes de Unicode, un conjunto de caracteres definía un conjunto de caracteres y cómo cada carácter se representaba como bits. La mayoría de los conjuntos de caracteres asignaron un carácter a un byte (lo que permitió un conjunto de 256 caracteres), algunos asignados a dos bytes y algunos (como ASCII) a solo 7 bits. Los diferentes conjuntos de caracteres a menudo asignaban diferentes valores al mismo carácter, y no había una clave de traducción universal entre los diversos conjuntos de caracteres en uso.
Unicode fue un intento de resolver este problema unificando todos los diversos conjuntos de caracteres en un "superconjunto" común. Para este propósito, Unicode introdujo algunos niveles adicionales de abstracción, por ejemplo, el concepto de codificación de caracteres como algo separado de los valores de los puntos de código. Esto permitió a Unicode redefinir los juegos de caracteres pre-unicode como codificaciones de caracteres unicode.
El atributo charset en HTML (que refleja el parámetro charset en el encabezado de tipo de contenido HTTP), por ejemplo, es anterior a la adopción generalizada de unicode, pero cuando se decidió aceptar unicode como el conjunto de caracteres universal de Internet, el atributo charset se redefinió para especificar la codificación en uso, pero el nombre no se cambió para permitir la compatibilidad con versiones anteriores.
fuente
El término "juego de caracteres" es, por supuesto, la abreviatura de "conjunto de caracteres", que a su vez es un término antiguo utilizado para una codificación de caracteres, que puede interpretarse como a) una asignación entre secuencias de bytes y caracteres, b) una asignación entre enteros (números de código) y caracteres o c) una asignación entre caracteres abstractos y enteros o secuencias de bytes.
Se usó el "conjunto de caracteres" ya que es una expresión corta y simple. En él, "conjunto" tiene un significado vago (ya que todo el concepto es vago), pero luego a menudo se ha malinterpretado como una colección ("conjunto" en sentido teórico establecido), como se describe en el famoso Conjunto de personajes de Dan Connelly (una vez) Considerado nocivo .
Lo que más importaba entonces era que el identificador
charset
se usara en MIME y en HTTP. HTTP 1.0 alias RFC 1945 cita la definición MIME, "un método utilizado con una o más tablas para convertir una secuencia de octetos en una secuencia de caracteres" y luego comenta sobre la confusión: "Este uso del término 'conjunto de caracteres' es más comúnmente conocido como "codificación de caracteres". Sin embargo, dado que HTTP y MIME comparten el mismo registro, es importante que la terminología también se comparta ".fuente
RFC2045 introdujo el "conjunto de caracteres" en MIME y para ese momento ya estaba claro que no todas las codificaciones asignaban un carácter a un octeto. RFC2130 discute esta historia un poco más.
Básicamente, "charset" era un término más popular cuando se escribían esos estándares, es más sucinto que "codificación de caracteres" o "esquema de codificación de texto", y menos ambiguo que "codificación".
fuente
Hay al menos 2 codificaciones aplicables a la transferencia de texto. La codificación de caracteres describe cómo se codifican los caracteres (glifos). Todos los idiomas usan un subconjunto del juego de caracteres UCS, que a menudo se codifican a un valor de 8 bits. Los juegos de caracteres estandarizados tienen codificaciones de caracteres estándar, y los términos generalmente se usan indistintamente.
La codificación de transferencia describe cómo se transfiere el texto y generalmente es independiente de la codificación de caracteres. La mayoría de las codificaciones de transferencia no son transparentes y alteran la secuencia de bytes que se transfiere. La codificación de transferencia de 8 bits es transparente para codificaciones de 8 bits. La codificación de transferencia de 7 bits solo puede transferir juegos de caracteres de 7 bits como ASCII
ASCII utiliza 95 caracteres imprimibles y algunos caracteres más para el control del carro (avance de línea, avance de formulario, retorno de carro, retroceso y tabulaciones) codificados en 7 bits. Hay caracteres de control adicionales que usan los valores restantes. ASCII es un subconjunto adecuado de los juegos de caracteres UCS, así como muchos de los juegos de caracteres de 8 bits. ISO-8859-1 también es un subconjunto adecuado del conjunto de caracteres UCS, pero estos caracteres tienen una codificación diferente en UTF-8, que utiliza múltiples bytes para valores de caracteres mayores que 127.
Los mainframes de IBM usan (d) el EBCDID que utilizó una codificación diferente de 8 bits. Hay tablas de traducción que asignan los caracteres imprimibles entre las codificaciones de caracteres ASCII y ECBDIC. ECBDIC tiene un conjunto de caracteres más grande que ASCII porque tiene signos de puntuación no disponibles en ASCII. Esto puede evitar la transformación completa de ida y vuelta entre estas dos codificaciones, si la codificación inicial es ECBDIC.
Estas codificaciones no eran suficientes para idiomas con caracteres no cubiertos por los caracteres imprimibles ASCII. Microsoft y otros utilizaron extensiones de 8 bits para el conjunto de caracteres ASCII y codificaron caracteres adicionales con valores superiores a 127. Una sola extensión no era suficiente para todos los idiomas, ya que estas extensiones solo agregaban hasta 96 caracteres al conjunto de caracteres. Esto dio como resultado el uso de múltiples conjuntos de caracteres (charsets) para diferentes idiomas con diferentes codificaciones de caracteres de 8 bits. Estos conjuntos de caracteres incluyen los caracteres necesarios para ese idioma o familia de idiomas. Los caracteres adicionales pueden codificarse a diferentes valores en diferentes conjuntos de caracteres. Es más probable que los usuarios ingleses lo noten con signos de puntuación extendidos (comillas y guiones izquierdos y derechos) que se muestran incorrectamente si se usa el juego de caracteres incorrecto.
Para codificaciones de un solo byte, solo se pueden codificar los caracteres del conjunto de caracteres. Algunos idiomas requieren codificaciones de varios bytes para cubrir su conjunto de caracteres. El conjunto de caracteres Unicode (UCS) requiere codificaciones de varios bytes para caracteres fuera del conjunto de caracteres ASCII. Este conjunto de caracteres es un superconjunto de todas las codificaciones específicas del idioma. UTF-8 es una codificación compacta del juego de caracteres UCS. ASCII no requiere bytes adicionales, y la mayoría (¿todos?) De los caracteres del idioma europeo se pueden codificar como uno o dos bytes. El conjunto completo de caracteres UCS-2 se puede codificar en uno a tres bytes. Todos los caracteres en el juego de caracteres UCS actual se pueden codificar en uno a cuatro bytes.
fuente
FWIW, IIRC, De vuelta en el Commodore 64 días, un conjunto de caracteres era una función desde {0, ... 255} al conjunto de todas las imágenes en blanco y negro de uxv donde u y v eran tal vez 8 y 12. Entonces "cambiando su juego de caracteres "significaba usar el comando POKE en el lenguaje BÁSICO para modificar las ubicaciones de memoria designadas para contener esas imágenes. Por ejemplo, el código ASCII 65 significaba A y la imagen de una A se almacenaría comenzando en la dirección de memoria a * 65 + b para algunos by supongo que a = u * v.
fuente