Diferencias de formato Unicode, UTF, ASCII, ANSI

351

¿Cuál es la diferencia entre los Unicode, UTF8, UTF7, UTF16, UTF32, ASCII, y ANSIcodificaciones?

¿De qué manera son útiles para los programadores?

web dunia
fuente

Respuestas:

470

Bajando tu lista:

  • " Unicode " no es una codificación, aunque desafortunadamente, mucha documentación la usa de manera imprecisa para referirse a la codificación Unicode que ese sistema en particular usa por defecto. En Windows y Java, esto a menudo significa UTF-16; en muchos otros lugares, significa UTF-8. Correctamente, Unicode se refiere al conjunto de caracteres abstractos en sí, no a ninguna codificación particular.
  • UTF-16 : 2 bytes por "unidad de código". Este es el formato nativo de cadenas en .NET, y generalmente en Windows y Java. Los valores fuera del plano multilingüe básico (BMP) se codifican como pares sustitutos. Estos solían ser relativamente raros, pero ahora muchas aplicaciones de consumo deberán conocer los caracteres que no son BMP para admitir emojis.
  • UTF-8 : codificación de longitud variable, 1-4 bytes por punto de código. Los valores ASCII se codifican como ASCII utilizando 1 byte.
  • UTF-7 : Usualmente usado para codificación de correo. Lo más probable es que si crees que lo necesitas y no estás haciendo correo, te equivocas. (Esa es solo mi experiencia con las personas que publican en grupos de noticias, etc., fuera del correo, realmente no se usa en absoluto).
  • UTF-32 : codificación de ancho fijo usando 4 bytes por punto de código. Esto no es muy eficiente, pero hace la vida más fácil fuera del BMP. Tengo una Utf32Stringclase .NET como parte de mi biblioteca MiscUtil , si alguna vez la quieres. (No se ha probado a fondo, ten en cuenta).
  • ASCII : codificación de un solo byte utilizando solo los 7 bits inferiores. (Puntos de código Unicode 0-127.) Sin acentos, etc.
  • ANSI: No hay una codificación ANSI fija, hay muchas. Por lo general, cuando las personas dicen "ANSI", se refieren a "la configuración regional / página de códigos predeterminada para mi sistema", que se obtiene a través de Encoding.Default , y a menudo es Windows-1252, pero puede ser otras configuraciones regionales.

Hay más en mi página Unicode y consejos para depurar problemas de Unicode .

El otro gran recurso de código es unicode.org, que contiene más información de la que jamás podrá abrirse paso, posiblemente el bit más útil es el gráfico de códigos .

Jon Skeet
fuente
66
El término "ANSI" cuando se aplica a las páginas de códigos de 8 bits de Microsoft es un nombre inapropiado. Se basaron en borradores enviados para la estandarización de ANSI, pero ANSI nunca los estandarizó. Windows-1252 (la página de códigos más comúnmente conocida como "ANSI") es similar a ISO 8859-1 (Latin-1), excepto que Windows-1252 tiene caracteres imprimibles en el rango 0x80..0x9F, donde ISO 8859-1 tiene caracteres de control en ese rango. Unicode también tiene caracteres de control en ese rango. en.wikipedia.org/wiki/Windows_code_page
Keith Thompson
1
@ jp2code: no lo haría, pero debe distinguir entre "contenido que se envía a través de HTTP desde el servidor web" y "contenido que se envía por correo electrónico". No es el contenido de la página web que envía el correo electrónico, es la aplicación detrás de él, presumiblemente. El contenido web sería el mejor en UTF-8; el contenido del correo podría estar en UTF-7, aunque sospecho que está bien mantenerlo en UTF-8 en estos días.
Jon Skeet
2
Para UTF-16, en mi humilde opinión, diría "2 bytes por unidad de código" ya que un punto de código fuera del BMP se codificará en pares sustitutos como 2 unidades de código (4 bytes).
Ludovic Kuty
1
Echa de menos las diferencias entre UTF-16LE (dentro de .NET) y BE, así como la noción de BOM.
Maarten Bodewes
2
@ Andrew: No, no hay un marcador de codificación (general). Windows 1252 no puede representar la lista de materiales Unicode, y no tendría sentido ya que de todos modos solo es una codificación de un byte por char.
Jon Skeet
68

Algunas lecturas para comenzar con las codificaciones de caracteres: Joel en software: el mínimo absoluto que todo desarrollador de software debe saber absolutamente, positivamente sobre los conjuntos de caracteres y Unicode (¡sin excusas!)

Por cierto, ASP.NET no tiene nada que ver con eso. Las codificaciones son universales.

Tomalak
fuente
77
Respondí aquí 6 años después de que se escribió el artículo. Lo leí 8 años después de que se escribió la publicación. 14 años después y sigue siendo una buena lectura. Eso fue hace más de la mitad de mi vida. Increíble.
Dave Knise el