2010-02-17 18 views
116

Estoy confundido acerca de la codificación de texto y el juego de caracteres. Por muchas razones, tengo que aprender cosas que no son Unicode ni UTF8 en mi próximo trabajo.¿Cuál es la diferencia entre la codificación y el juego de caracteres?

La palabra "juego de caracteres" aparece en los encabezados de los correos electrónicos como en "ISO-2022-JP", pero no hay codificación en los editores de texto. (Miré alrededor de los diferentes editores de texto.)

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

+0

Ver esta publicación: http://stackoverflow.com/questions/13743250/meaning-of-xml-version-1-0-encoding-utf-8?lq=1 – rghome

Respuesta

107

Básicamente:

  1. juego de caracteres es el conjunto de caracteres que se pueden utilizar
  2. codificación es la forma en que estos caracteres son almacenados en la memoria
+34

Es cierto, pero en el uso real "juego de caracteres" generalmente se refiere a * ambos * el repertorio de caracteres y el esquema de codificación. –

+0

@AlanMoore De hecho, casi de la misma manera que las personas dicen "número decimal" para referirse a cualquier número con un "separador decimal". No es realmente correcto, pero sí debes saber que algunas personas lo usan así. – bvdb

70

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

Sin embargo, estamos en el camino de la transición a Unicode, que incluye un juego 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 mapear 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áquina.

+11

Tenga en cuenta que javadoc utiliza erróneamente "charset" en su lugar de "codificación", por ejemplo en [InputStreamReader] (http://docs.oracle.com/javase/7/docs/api/java/io/InputStreamReader.html), leemos * "Un InputStreamReader es un puente de byte transmite flujos de caracteres: lee bytes y los decodifica en caracteres utilizando un conjunto de caracteres específico. El conjunto de caracteres que utiliza se puede especificar por nombre o se puede dar explícitamente, o se puede aceptar el juego de caracteres predeterminado de la plataforma. "*. Sin embargo, lo que quieren decir es "codificación". –

+0

Gracias por su 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

8

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 personaje en el repertorio. Una codificación es una forma de representar puntos de código de forma inequívoca como una secuencia de bytes.

5

Un conjunto de caracteres es solo un conjunto; contiene, por ejemplo, el signo del euro, o de lo contrario no lo hace. Eso es todo.

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

+0

¿Tiene que ser bijective? –

+2

Bueno, la codificación y la decodificación deben ser deterministas, por lo que realmente no puede haber asignaciones ambiguas. Supongo que podría tener un conjunto de enteros no contiguos como codomain, pero eso desperdiciaría espacio cuando almacene texto, y los ingenieros detestan el espacio desperdiciado. –

+1

Las codificaciones de caracteres heredados a menudo no son biyectivos. Por ejemplo, en IBM437, tanto ß como β están representados por 0xE1. – dan04

40

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 desarrollador absoluto Cada mínimos de software absolutamente, positivamente debe saber sobre Unicode y juegos de caracteres (Sin excusas!) "escrito por Joel Spolsky. El ensayo tiene más de 10 años, pero (lamentablemente) el contenido sigue siendo válido ...

+2

Muchas gracias por presentar el artículo. It * is * a good one. –

+7

Esta respuesta podría mejorarse dando una breve explicación de * por qué * Debería leer el artículo de Joel. –

+0

@mattanja El enlace que proporcionaste es realmente genial. Gracias por compartir. Votado arriba. – hagrawal

6

Google lo buscó. http://en.wikipedia.org/wiki/Character_encoding

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

Los conjuntos de caracteres realmente se saltan esto y saltan directamente de los caracteres a los bytes. secuencia de bytes < -> secuencia de caracteres

En resumen, codificación: los puntos de código -> bytes charset: personajes -> bytes

23

Una codificación de caracteres consta de:

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

Paso # 1 por sí mismo es un" carácter repertorio "o conjunto de caracteres abstractos", y # 1 + # 2 = a "conjunto de caracteres codificados".

Pero antes de que Unicode se hiciera popular y todos (excepto los asiáticos orientales) utilizaban 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 anteriores usan charset cuando realmente quieren decir codificación.

+0

¿sería por eso que podemos leer charset = 'utf-8' en la etiqueta html META? porque fue definido hace mucho tiempo – Eildosa

10

Lanzando más luz para las personas que nos visitan desde ahora, con suerte sería útil.


juego de caracteres

Hay personajes en cada idioma y la recogida de esos personajes forman el “conjunto de caracteres” de ese idioma. Cuando un personaje está codificado, le asigna un identificador único o número llamado 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 los caracteres de todos los idiomas que viven en el mundo)

conjunto de caracteres codificados

Una de caracteres codificados set es un conjunto en el que se asigna un número único a cada personaje. Ese número único se llama como "punto de código".
Los conjuntos de caracteres codificados a veces se denominan páginas de códigos.

Codificación

La codificación es el mecanismo para asignar los puntos de código con algunos bytes de manera que un personaje puede ser leído y escrito de manera uniforme en los diferentes sistemas utilizando el mismo esquema de codificación.

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

Elaboración de 3 conceptos anteriores

  • Considere esto - Carácter 'क' en Devanāgarī conjunto de caracteres tiene un decimal punto de código de 2325 que será representado por dos bytes (09 15) al utilizar la codificación UTF-16
  • en “ISO-8859-1” “ü” esquema de codificación (esto no es más que un personaje de juego de caracteres latinos) se representa como valor hexa-decimal de “FC”, mientras que en “UTF -8 "representaba como" C3 BC "y en UTF-16 como" FE F F 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 se puede asignar a diferentes secuencias de bytes, dependiendo de qué codificación se utilizó para el documento. El carácter Devanagari क, con código de punto 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)
1

En mi opinión, la palabra "charset" debe limitarse a identificar el parámetro utilizado en HTTP, MIME y estándares similares para especificar una codificación de caracteres (un mapeo 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 referirse a una codificación de caracteres.

Cuestiones relacionadas