ASCII es fundamental
Originalmente 1 personaje siempre se almacena como 1 byte. Un byte (8 bits) tiene el potencial de distinguir 256 valores posibles. Pero, de hecho, , solo se usaron los primeros 7 bits. Entonces solo se definieron 128 caracteres. Este conjunto se conoce como con el juego de caracteres ASCII.
0x00
- 0x1F
contienen códigos de dirección (por ejemplo CR, LF, STX, ETX, EOT, BEL, ...)
0x20
- 0x40
contienen números y puntuacion
0x41
- 0x7F
contienen caracteres alfabéticos mayoría
0x80
- 0xFF
el octavo bit = indefinido.
Francés, alemán y muchos otros idiomas necesitan caracteres adicionales. (por ejemplo, à, é, ç, ô, ...
) que no estaban disponibles en el juego de caracteres ASCII. Entonces usaron el 8vo bit para definir sus personajes. Esto es lo que se conoce como "extended ASCII".
El problema es que el 1 bit adicional no tiene capacidad suficiente para cubrir todos los idiomas del mundo. Entonces, cada región tiene su propia variante ASCII. Hay muchas codificaciones ASCII extendidas (latin-1
siendo una muy popular).
pregunta popular: "Es un personaje ASCII o se trata de una codificación"? ASCII
es un conjunto de caracteres. Sin embargo, en la programación charset
y encoding
se usan ampliamente como sinónimos. Si quiero hacer referencia a una codificación que solo contiene los caracteres ASCII y nada más (el 8vo bit es siempre 0): eso es US-ASCII
.
Unicode da un paso más
Unicode también es un conjunto de caracteres (no una codificación). Utiliza los mismos caracteres como el estándar ASCII, pero amplía la lista con caracteres adicionales, lo que le da a cada carácter un punto de código en el formato u+xxxx
. Tiene la ambición de contener todos los personajes (e iconos populares) utilizados en todo el mundo.
UTF-8, UTF-16 y UTF-32 son codificaciones que aplican la tabla de caracteres Unicode. Pero cada uno de ellos tiene una forma ligeramente diferente de cómo codificarlos. UTF-8 solo usará 1 byte al codificar un carácter ASCII, dando el mismo resultado que cualquier otra codificación ASCII. Pero para otros personajes, usará el primer bit para indicar que seguirá un segundo byte.
GBK es una codificación, que al igual que UTF-8 usa múltiples bytes. El primer byte sigue el estándar ASCII, por lo que solo se utilizan 7 bits. El octavo bit se usa para indicar la presencia de un segundo byte, que se usa para representar aproximadamente 22,000 caracteres chinos. Pero una diferencia importante es que este no respeta el conjunto de caracteres Unicode.
tipos Mime
tipos MIME son también confunde a menudo con codificaciones.
No hay una forma sencilla de decodificar un archivo. Hubiera sido ideal si todos los archivos contuvieran un prefijo para indicar en qué codificación se almacenaban sus datos. Al final, corresponde a la aplicación (o su desarrollador) determinar una codificación (por ej. US-ASCII
, UTF-8
, algunos valores predeterminados del sistema). ..).
Al enviar datos a través de Internet, existe el mismo problema.Afortunadamente, algunos protocolos, como HTTP, usan declaraciones de tipo MIME para especificar qué tipo de datos y conjunto de caracteres utilizan los datos. Un encabezado HTTP típico contiene esto:
Content-Type: text/html; charset=utf-8
Pero para text/xml
que no tendría sentido (un parámetro charset incluso serán ignorados). Los analizadores XML en general leerán la primera línea del archivo, buscando la etiqueta <?xml encoding=...
. Si está allí, entonces volverán a abrir el archivo usando esa codificación.
El mismo problema existe when sending e-mails. Un correo electrónico puede contener un mensaje html o simplemente texto sin formato.
accesos directos
En caso de Java (y muchos otros lenguajes de programación), además de los peligros de las codificaciones, hay también la complejidad de fundición bytes y enteros a personajes debido a que su contenido se almacena en diferentes rangos.
- un byte se almacena como un byte con signo (rango:
-128
a 127
).
- el tipo
char
en Java se almacena en 2 bytes sin signo (rango: 0
- 65535
)
- una corriente devuelve un entero en el rango
-1
a 255
.
Si sabe que sus datos solo contienen valores ASCII. Luego, con la habilidad adecuada, puede analizar sus datos de bytes a caracteres o envolverlos inmediatamente en Cadenas.
// the -1 indicates that there is no data
int input = stream.read();
if (input == -1) throw new EOFException();
// bytes must be made positive first.
byte myByte = (byte) input;
int unsignedInteger = myByte & 0xFF;
char ascii = (char)(unsignedInteger);
El acceso directo en Java es el uso de lectores y escritores y para especificar la codificación cuando se crea una instancia.
// wrap your stream in a reader.
// specify the encoding
// The reader will decode the data for you
Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
Como se ha explicado anteriormente para los archivos XML que no importa mucho, porque cualquier DOM decente o marshaller JAXB comprobará si hay un atributo de codificación.
El recurso clásico fuera del sitio para esto es el ensayo de Joel Spolsky [_El mínimo absoluto de cada desarrollador de software Absolutamente, definitivamente debe saber sobre Unicode y juegos de caracteres (Sin excusas!) _] (Http://www.joelonsoftware.com/ artículos/Unicode.html). – Raedwald
Es una respuesta tardía, pero publiqué algunas explicaciones sobre las codificaciones y conjuntos de caracteres mencionados + también algunos accesos directos (por ejemplo, para Java) – bvdb