encoding - identifiers - codepage 1252
¿Cuál es la diferencia entre una "codificación", un "conjunto de caracteres" y una "página de códigos"? (5)
El capítulo sobre Unicode en este libro, Programación avanzada de Perl contiene la mejor descripción de la codificación, los conjuntos de caracteres y las otras entidades de Unicode que he encontrado. Lamentablemente no creo que esté disponible de forma gratuita en línea.
Realmente estoy tratando de mejorar con estas cosas. Soy bastante funcional con conceptos de internacionalización como este, pero necesito tener una mejor base en la teoría que la respalda.
He leído el artículo de Spolsky , pero aún no estoy claro porque estos tres términos se usan indistintamente, incluso en ese artículo. Creo que al menos dos de ellos están hablando de lo mismo.
Sospecho que un alto porcentaje de desarrolladores se abren camino a través de estas cosas a diario. Ya no quiero ser uno de esos desarrolladores.
Pensé que el artículo de Joel fue bastante acertado: es la historia detrás de la evolución de los conjuntos de caracteres y el almacenamiento lo que ha provocado esto.
FWIW, en mi punto de vista simplista
- Los conjuntos de caracteres (ASCII, EBCDIC, UNICODE) serían la representación numérica de los caracteres, independientemente de las consideraciones de almacenamiento.
- La codificación se relacionaría con el almacenamiento eficiente de caracteres, ANSI, UTF-7, UTF-8, etc., para el archivo, a través del cable, etc.
- La página de códigos sería el ''kluge'' necesario cuando la demanda de agregar nuevos caracteres (sin querer aumentar la capacidad de almacenamiento) significaba que (ciertos) caracteres solo se conocían en el contexto adicional de una página de códigos.
En mi humilde opinión, la Wikipedia actualmente no ayuda a las cosas definiendo la página de códigos como ''otro nombre para la codificación de caracteres'' y redirigiendo ''conjunto de caracteres'' a ''codificación de caracteres''
Un ''conjunto de caracteres'' es justo lo que dice: una lista correctamente especificada de caracteres distintos.
Una "codificación" es una asignación entre un conjunto de caracteres (generalmente Unicode hoy) y una representación técnica (generalmente basada en bytes) de los caracteres.
UTF-8 es una codificación, pero no un conjunto de caracteres. Es una codificación del juego de caracteres Unicode (*).
La confusión se produce porque la mayoría de las demás codificaciones conocidas (por ej .: ISO-8859-1) comenzaron como conjuntos de caracteres separados. Luego, cuando Unicode apareció como un superconjunto de la mayoría de estos conjuntos de caracteres, fue posible pensar en ellos como codificaciones diferentes (pero parciales) del mismo conjunto de caracteres (Unicode), en lugar de solo conjuntos de caracteres aislados. Mirándolos de esta manera te permite convertir entre ellos a través de Unicode fácilmente, lo que no sería posible si fueran simplemente conjuntos de caracteres aislados. Pero todavía tiene sentido referirse a ellos como conjuntos de caracteres, por lo que se podría usar cualquiera de los dos términos.
Una ''página de códigos'' es un término que proviene de IBM, donde eligió qué conjunto de símbolos se mostraría. El término continuó siendo utilizado por DOS y luego por Windows, a través de Windows compatible con Unicode, donde solo actúa como una codificación con un identificador numerado. Si bien una ''página de códigos'' numerada es una idea que no se limita intrínsecamente a Microsoft, hoy en día el término casi siempre significa una codificación que Windows conoce.
Cuando uno está hablando de la página de códigos ‹algún número› está hablando típicamente de una codificación específica de Windows, a diferencia de una codificación diseñada por un cuerpo de estándares. Por ejemplo, la página de códigos 28591 normalmente no se hace referencia a ese nombre, sino simplemente ''ISO-8859-1''. La codificación de Europa Occidental específica de Windows basada en ISO-8859-1 (con algunos caracteres adicionales que reemplazan algunos de sus códigos de control) normalmente se conoce como ''página de códigos 1252''.
[*: Todos los UTF son codificaciones y no conjuntos de caracteres, pero este tipo de cosas no son exclusivas de Unicode. Por ejemplo, el estándar japonés JIS X 0208 define un conjunto de caracteres y dos codificaciones de bytes diferentes: la codificación un tanto desagradable basada en bytes altos (''Shift-JIS'') y la codificación profundamente horrorosa basada en el cambio de escape (''JIS '').]
Un conjunto de caracteres es solo eso, un conjunto de caracteres que se pueden utilizar.
Cada uno de estos caracteres se asigna a un entero llamado punto de código.
Cómo se representan estos puntos de código en la memoria es la codificación. Una codificación es solo un método para transformar un punto de código (U + 0041 - Punto de código Unicode para el carácter "A") en datos sin procesar (bits y bytes).
Un conjunto de caracteres es un conjunto de caracteres, es decir, "glifos", es decir, símbolos visuales que representan unidades de comunicación. La letra a
es un glifo y también lo es €
(símbolo del euro). Los conjuntos de caracteres generalmente asignan números enteros (puntos de código) a cada carácter, pero es la codificación la que dicta la representación binaria del carácter.
Soy un programador de Ruby, así que aquí hay algunos ejemplos para ayudarte a entender los conceptos.
Esto revela cómo Unicode asigna puntos de código a los caracteres, pero no cómo se almacena cada byte. (Ruby 1.9 utiliza de forma predeterminada las cadenas Unicode).
>> ''a''.codepoints.to_a
=> [97]
>> ''€''.codepoints.to_a
=> [8364]
Lo siguiente revela cómo la codificación UTF-8 almacena cada carácter como bytes (0 a 255 en base-10). (La codificación predeterminada de Ruby 1.9 es UTF-8). Dado que 8364 (base 10) es demasiado grande para caber en un byte, UTF-8 tiene una estrategia específica para dividirlo en varios bytes. Wikipedia muestra el algoritmo de codificación UTF-8, si desea profundizar en la implementación.
>> ''a''.bytes.to_a
=> [97]
>> ''€''.bytes.to_a
=> [226, 130, 172]
Esto es lo mismo en el conjunto de caracteres ISO-8859-15:
>> ''a''.encode(''iso-8859-15'').codepoints.to_a
=> [97]
>> ''€''.encode(''iso-8859-15'').codepoints.to_a
=> [164]
Y la codificación ISO-8859-15:
>> ''a''.encode(''iso-8859-15'').bytes.to_a
=> [97]
>> ''€''.encode(''iso-8859-15'').bytes.to_a
=> [164]
Observe que los puntos de código ISO-8859-15 coinciden con la representación de bytes.
Aquí hay una entrada de blog que podría ser útil: http://blog.grayproductions.net/articles/what_is_a_character_encoding . Las entradas 1 a 3 son buenas si no quieres ser demasiado específico para el rubí.