2010-08-09 29 views
16

Estoy tratando de mejorar con estas cosas. Soy bastante funcional con conceptos de internacionalización como este, pero necesito obtener un mejor conocimiento de la teoría detrás de esto.¿Cuál es la diferencia entre una "codificación", un "conjunto de caracteres" y una "página de códigos"?

He leído Spolsky's article, pero sigo sin estar claro porque estos tres términos se usan indistintamente MUCHO, 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 abre paso a través de estas cosas a diario. Ya no quiero ser uno de esos desarrolladores.

Respuesta

27

Un 'juego de caracteres' es exactamente lo que dice: una lista de caracteres distintos debidamente especificada.

Una 'codificación' es una asignación entre un juego de caracteres (generalmente Unicode hoy) y una representación técnica (normalmente 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 otras codificaciones conocidas (p. Ej .: ISO-8859-1) comenzaron como juegos de caracteres separados. Luego, cuando Unicode apareció como un superconjunto de la mayoría de estos conjuntos de caracteres, se hizo posible pensar en ellos como codificaciones diferentes (pero parciales) del mismo conjunto de caracteres (Unicode), en lugar de simplemente conjuntos de caracteres aislados. Mirarlos de esta manera le permite convertir fácilmente entre ellos a través de Unicode, 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 cualquiera de los términos podría ser utilizado.

Una 'página de códigos' es un término que proviene de IBM, donde elige qué conjunto de símbolos se mostrarán. El término continuó siendo utilizado por DOS y luego Windows, a través de Windows consciente de Unicode, donde simplemente actúa como una codificación con un identificador numerado. Mientras que una 'página de códigos' numerada es una idea no intrínsecamente limitada a Microsoft, hoy en día el término casi siempre solo significa una codificación que Windows conoce.

Cuando uno está hablando de la página de códigos uno generalmente está hablando de una codificación específica de Windows, a diferencia de una codificación ideada por un cuerpo de estándares. Por ejemplo, la página de códigos 28591 normalmente no se menciona bajo 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 denominaría 'página de códigos 1252'.

[*: todas las UTF son codificaciones, no juegos 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 para él: la codificación algo desagradable de alto byte ('Shift-JIS') y la codificación profundamente horrible basada en el cambio de escape ('JIS ').]

5

Un conjunto de caracteres es simplemente eso, un conjunto de caracteres que se pueden utilizar.
Cada uno de estos caracteres está asignado 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 brutos (bits y bytes).

1

El capítulo sobre Unicode en este libro, Advanced Perl Programming contiene la mejor descripción de codificación, juegos de caracteres y otras entidades de Unicode con las que me he encontrado. Lamentablemente, no creo que esté disponible de forma gratuita en línea.

+1

Tengo una suscripción a Safari. Acabo de descargar el capítulo, gracias. – Deane

+0

mismo aquí con la suscripción de safari :-) gracias, en buen estado –

3

Pensé que el artículo de Joel era bastante acertado: es la historia detrás de la evolución de los juegos de caracteres y el almacenamiento lo que ha provocado esto.

Fwiw, en mi opinión demasiado simplista

  • el conjunto de caracteres (ASCII, EBCDIC, Unicode) sería la representación numérica de caracteres, independiente de consideraciones de almacenamiento
  • codificación se relacionaría con el almacenamiento eficiente de los personajes, ANSI, UTF-7, UTF-8, etc., para archivos, a través del cable, etc.
  • Página de códigos sería el 'kluge' necesario cuando la demanda de la adición de 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.

mi humilde opinión Wikipedia Actualmente no ayuda cosas definiendo code page como 'otro nombre para la codificación de caracteres' y redirigir 'juego de caracteres' a 'character encoding'

+0

en mi humilde opinión, no existe tal codificación 'ANSI'. El nombre "ANSI" es un nombre inapropiado. – nn0p

6

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 juegos de caracteres generalmente asignan enteros (puntos de código) a cada personaje, pero es la codificación la que dicta la representación binaria del personaje.

Soy un programador de ruby, así que aquí hay algunos ejemplos para ayudarlo a comprender los conceptos.

Esto revela cómo Unicode asigna los puntos de código a los caracteres, pero no cómo se almacena cada byte. (Ruby 1.9 valores predeterminados para cadenas Unicode.)

>> 'a'.codepoints.to_a 
=> [97] 
>> '€'.codepoints.to_a 
=> [8364] 

El siguiente revela cómo los codificación UTF-8 almacena cada carácter como bytes (0-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 múltiples 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] 

Aquí es lo mismo que en la norma ISO-8859-15 juego de caracteres:

>> '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] 

en cuenta que la norma ISO-8859- 15 puntos de código 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 ponerte demasiado específico de ruby.

Cuestiones relacionadas