encoding - una - utf 32
¿Cuál es la diferencia entre la codificación y el juego de caracteres? (10)
Estoy confundido acerca de la codificación de texto y el juego de caracteres. Por muchas razones, tengo que aprender cosas que no sean Unicode y que no sean UTF8 en mi próximo trabajo.
Encuentro la palabra "juego de caracteres" en los encabezados de los correos electrónicos como en "ISO-2022-JP", pero no hay tal 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? Te agradecería si pudieras mostrarme algunos ejemplos de casos de uso.
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 sobre Unicode y juegos de caracteres (sin excusas) " escrito por Joel Spolsky . El ensayo tiene más de 10 años pero (desafortunadamente) el contenido aún es válido ...
Básicamente:
- charset es el conjunto de caracteres que puede usar
- la codificación es la forma en que estos caracteres se almacenan en la memoria
Buscado en Google 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 a bytes.
Los conjuntos de caracteres realmente omiten esto y saltan directamente de los caracteres a los bytes. secuencia de bytes <-> secuencia de caracteres
En resumen, codificación: puntos de código -> bytes charset: caracteres -> bytes
Cada codificación tiene un juego 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.
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 (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 referirse a una codificación de caracteres.
Un conjunto de caracteres es solo un conjunto; contiene, por ejemplo, el símbolo del euro o, de lo contrario, no. Eso es todo.
Una codificación es un mapeo biyectivo desde un conjunto 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.
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.
Una codificación de caracteres consiste en:
- El conjunto de caracteres compatibles
- Un mapeo entre caracteres y enteros ("puntos de código")
- 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)
- 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 un "conjunto de caracteres" abstracto, y # 1 + # 2 = un "juego de caracteres codificado".
Pero antes de que Unicode se hiciera popular y todos (excepto los asiáticos orientales) usaban 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 usan charset
cuando realmente significan codificación.
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 los bytes y los caracteres .
Piense en los bytes como números entre 0 y 255, mientras que los caracteres son abstractos como "a", "1", "$" y "Ä". El conjunto de todos los caracteres que están disponibles se llama conjunto de caracteres .
Cada personaje 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 conjunto de caracteres y codificación antiguos llamados 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 estadounidense.
Por ejemplo, aquí hay 6 caracteres en el juego 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 comienza 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 juego de caracteres diferente) y necesita una codificación diferente, ya que 128 caracteres no es suficiente 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, existe CP1252 o ISO-8859-1, mientras que los usuarios de Linux tienden a favorecer a UTF-8. Java usa UTF-16 de forma nativa.
Una secuencia de valores de bytes para un carácter en una codificación podría representar un personaje completamente diferente en otra codificación, o incluso podría ser inválida.
Por ejemplo, en ISO 8859-1 , â se representa por un byte de valor 226
, mientras que en UTF-8 son dos bytes: 195, 162
. Sin embargo, en ISO 8859-1 , 195, 162
serían dos caracteres, Ã, ¢ .
Cuando las computadoras almacenan datos sobre los caracteres internamente o lo transmiten a otro sistema, almacenan o envían bytes. Imagine que un sistema que abre un archivo o recibe un mensaje ve los bytes 195, 162
. ¿Cómo sabe qué personajes son estos?
Para que el sistema interprete esos bytes como caracteres reales (y así mostrarlos o convertirlos 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.
Arrojando más luz para las personas que visitan desde ahora, con suerte sería útil.
Conjunto de caracteres
Hay personajes en cada idioma y la colección de esos personajes forma el "juego 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 juego de caracteres: ASCII (cubre todos los caracteres en inglés), ISO / IEC 646, Unicode (cubre personajes 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 personaje. Ese número único se llama como "punto de código".
Los juegos de caracteres codificados a veces se llaman 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 personaje pueda leerse y escribirse uniformemente en diferentes sistemas usando 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 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 conjunto de caracteres latinos) se representa como el valor hexadecimal de "FC", mientras que en "UTF-8" representa como "C3 BC" y en UTF-16 como "FE 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 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)