¿Cuál es la diferencia exacta entre Windows-1252(1/3/4) e ISO-8859-1?


Estamos alojando aplicaciones PHP en una instalación LAMP basada en Debian. Todo está bastante bien: rendimiento, administración y gestión. Sin embargo, al ser un poco nuevos desarrolladores (todavía estamos en la escuela secundaria), nos hemos encontrado con algunos problemas con la codificación de caracteres para los conjuntos de caracteres occidentales.

Después de hacer muchas investigaciones, he llegado a la conclusión de que la información en línea es algo confusa. Está hablando de que Windows-1252 es ANSI y totalmente compatible con ISO-8859-1.

Entonces, ¿cuál es la diferencia entre Windows-1252(1/3/4) e ISO-8859-1? ¿Y dónde entra ANSI en esto de todos modos?

¿Qué codificación debemos usar en nuestros servidores Debian (y estaciones de trabajo) para asegurarnos de que los clientes obtengan toda la información de la manera prevista y que no perdamos ningún carácter en el camino?

Author: Benjamin, 2013-10-01

4 answers

Me gustaría responder a esto de una manera más similar a la web y con el fin de responder a lo que necesitamos un poco de historia. Joel Spolsky ha escrito un muy buen artículo introductorio sobre el mínimo absoluto que todo desarrollador debe saber sobre la Codificación de caracteres Unicode. Ten paciencia conmigo aquí porque esto va a ser algo así como una respuesta looong. :)

Como historia voy a señalar algunas citas de allí: (Muchas gracias Joel! :) )

Los únicos caracteres que importaban eran buenas y viejas letras inglesas sin acento, y teníamos un código para ellas llamado ASCII que era capaz de representar cada carácter usando un número entre 32 y 127. El espacio era 32, la letra "A" era 65, etc. Esto podría almacenarse convenientemente en 7 bits. La mayoría de las computadoras en esos días usaban bytes de 8 bits, por lo que no solo podía almacenar todos los caracteres ASCII posibles, sino que tenía un poco de sobra, que, si era malvado, podría usar para sus propios fines tortuosos.

Y todo fue bien, suponiendo que hablaras inglés. Debido a que los bytes tienen espacio para hasta ocho bits, mucha gente se puso a pensar, "Dios, podemos usar los códigos 128-255 para nuestros propios propósitos."El problema era que mucha gente tenía esta idea al mismo tiempo, y tenían sus propias ideas de lo que debería ir a donde en el espacio de 128 a 255.

Así que ahora los "juegos de caracteres OEM" se distribuían con PCs y estos seguían siendo diferentes e incompatibles. Y para nuestro asombro contemporáneo-fue todo bien! No tenían Internet de vuelta y la gente rara vez intercambiaba archivos entre sistemas con diferentes locales.

Joel continúa diciendo:

De hecho, tan pronto como la gente comenzó a comprar PC fuera de los Estados Unidos, se idearon todo tipo de juegos de caracteres OEM diferentes, que utilizaron los 128 caracteres principales para sus propios fines. Finalmente, este OEM free-for-all se codificó en el estándar ANSI. En el estándar ANSI, todos acordaron qué hacer por debajo de 128, que era más o menos lo mismo que ASCII, pero había muchas maneras diferentes de manejar los personajes de 128 en adelante, dependiendo de dónde vivieras. Estos diferentes sistemas fueron llamados páginas de código.

Y así es como las "páginas de código de Windows" nacieron, eventualmente. En realidad fueron "padres" por las páginas de código de DOS. ¡Y luego nació Unicode! :) y UTF-8 es "otro sistema para almacenar su cadena de puntos de código Unicode" y en realidad " cada punto de código de 0 a 127 se almacena en un solo byte" y es lo mismo que ASCII. No entraré en más detalles de Unicode y UTF-8, pero deberías leer la lista de materiales , Endianness and Character Encoding as a general.

En" the ANSI conspiracy", Microsoft realmente admite el error de etiquetado de Windows-1252 en un glosario de términos :

El llamado conjunto de caracteres de Windows (WinLatin1, o página de código de Windows 1252, para ser exacto) utiliza algunas de esas posiciones para caracteres imprimibles. Por lo tanto, el conjunto de caracteres de Windows NO es idéntico a ISO 8859-1. El conjunto de caracteres de Windows a menudo se llama "conjunto de caracteres ANSI", pero esto es MUY ENGAÑOSO. NO ha sido aprobado por ANSI.

Por lo tanto, ANSI cuando se refiere a conjuntos de caracteres de Windows no está certificado ANSI! :)

Como Jukka señaló (los créditos van para usted por la respuesta agradable)

Windows-1252 ISO Latin 1, también conocido como ISO-8859 - 1 como codificación de caracteres, de modo que el rango de código 0x80 a 0x9F está reservado para los caracteres de control en ISO-8859-1 (los llamados controles C1), mientras que en Windows-1252, algunos de los códigos se asignan a caracteres imprimibles (principalmente caracteres de puntuación), otros se dejan sin definir.

Sin embargo, mi opinión personal y comprensión técnica es que tanto Windows-1252 como ISO-8859-1 NO SON CODIFICACIONES WEB! :) So:

  • Para páginas web por favor use UTF-8 como codificación para el contenido Así que almacene los datos como UTF-8 y" escúpalo " con el encabezado HTTP : Content-Type: text/html; charset=utf-8.

    También hay una cosa llamada meta-etiqueta de tipo de contenido HTML: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> Ahora, lo que los navegadores realmente hacen cuando encuentran esta etiqueta es que comienzan desde el principio del documento HTML de nuevo para que puedan reinterpretar el documento en la codificación declarada. Esto debería suceder solo si no hay encabezado' Content-type'.

  • Use otro codificaciones específicas si los usuarios de su sistema necesitan archivos generados a partir de él. Por ejemplo, algunos usuarios occidentales pueden necesitar archivos generados en Excel o CSV en Windows-1252. Si este es el caso, codifique el texto en esa configuración regional y luego guárdelo en el fs y sírvalo como un archivo descargable.

  • Hay otra cosa a tener en cuenta en el diseño de HTTP : El mecanismo de distribución de codificación de contenido debería funcionar así.

    I. El cliente solicita una web page in a specific content-types and codings via: the 'Accept ' and' Accept-Charset ' request headers.

    II. Luego el servidor (o aplicación web) devuelve el contenido trans-codificado a esa codificación y conjunto de caracteres.

Este NO ES EL CASO en la mayoría de las aplicaciones web modernas. Lo que realmente sucede es que las aplicaciones web sirven (fuerzan al cliente) contenido como UTF-8. Y esto funciona porque los navegadores interpretan los documentos recibidos en función de los encabezados de respuesta y no en lo que realmente esperaban.

Todos deberíamos ir Unicode, así que por favor, por favor, por favor utilice UTF-8 para distribuir su contenido siempre que sea posible y sobre todo aplicable. ¡O de lo contrario los ancianos de Internet te perseguirán! :)

P.d. Algunos artículos más interesantes sobre el uso de caracteres de MS Windows en páginas Web se pueden encontrar aquí y aquí.

 27
Author: Borislav Sabev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-04 19:05:18

La referencia más autorizada a los significados de los nombres de codificación de caracteres es el registro IANA Conjuntos de caracteres.

Windows-1252 se conoce comúnmente como Windows Latin 1 o como Windows West European o algo así. Difiere de ISO Latin 1, también conocido como ISO-8859 - 1 como codificación de caracteres, por lo que el rango de código 0x80 a 0x9F está reservado para los caracteres de control en ISO-8859 - 1 (los llamados controles C1), donde en Windows-1252, algunos de los códigos se asignan a caracteres imprimibles (en su mayoría caracteres de puntuación), otros se dejan sin definir.

ANSI viene aquí como un nombre inapropiado. Microsoft una vez presentó Windows-1252 al American National Standards Institute (ANSI) para ser adoptado como estándar; la propuesta fue rechazada, pero Microsoft todavía llama a su código "ANSI". Para mayor confusión, pueden usar "ANSI" para diferentes codificaciones (básicamente, la "codificación nativa de 8 bits" de una instalación de Windows).

En el contexto web, declarando ISO-8859-1 se tomará como si hubiera declarado Windows-1252. La razón es que los controles C1 no se utilizan, o no son útiles, en la web, mientras que los caracteres añadidos se utilizan a menudo, incluso en páginas mal etiquetadas como ISO-8859-1. Así que, en términos prácticos, no importa cuál declare.

Todavía puede haber algunos navegadores que realmente interpretan los datos como ISO-8859-1 si se declara así, pero deben ser muy raros (la última que recuerdo ver fue una versión de Opera hace unos diez años).

Lo haces no describa los problemas que ha encontrado. La causa más común de problemas parece ser que los datos están codificados en UTF-8 pero declarados como ISO-8859-1 (o Windows-1252), o viceversa. Esto se convierte en un problema real para los autores de páginas web si un servidor fuerza un encabezado Content-Type declarando una codificación de caracteres y es uno con el que no pueden lidiar en su entorno de creación (o no saben cómo hacerlo).

 14
Author: Jukka K. Korpela,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-04 19:03:31

8859-1 y 1252

Http://www.w3schools.com/charsets/ref_html_ansi.asp

ANSI (Windows-1252) ANSI era el conjunto de caracteres predeterminado en Windows arriba a Windows 95.

ANSI también se llama Windows-1252.

Nota importante ANSI e ISO-8859-1 son muy similares. Sólo difieren en 32 caracteres.

En ANSI, los caracteres de 128 a 159 se utilizan para algunos útiles caracteres como el símbolo del euro.

En ISO-8859 - 1 estos caracteres se asignan a caracteres de control que son inútiles en HTML.

__ así que una sugerencia así que ver si 128 es símbolo euro.. si lo es, es ANSI/windows 1252. __

Haga clic en siguiente referencia da este enlace

Http://www.w3schools.com/charsets/ref_html_8859.asp

Los códigos del 128 al 159 no están en uso en ISO-8859-1, pero muchos los navegadores mostrarán los caracteres del ANSI (Windows-1252) juego de caracteres en lugar de Nada.

Esos 2 enlaces listan ambos.

 1
Author: barlop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-04 04:34:18

Esta tabla ofrece una visión general de las diferencias. Muestra todos los caracteres definidos en Windows-1252 pero no disponibles en ISO-8859-1/ISO-8859-15:

        │  …0  │  …1  │  …2  │  …3  │  …4  │  …5  │  …6  │  …7  │  …8  │  …9  │  …A  │  …B  │  …C  │  …D  │  …E  │  …F  │
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
     8… │   €  │      │   ‚  │   ƒ  │   „  │   …  │   †  │   ‡  │   ˆ  │   ‰  │   Š  │   ‹  │   Œ  │      │   Ž  │      │
Unicode │ 20AC │      │ 201A │ 0192 │ 201E │ 2026 │ 2020 │ 2021 │ 02C6 │ 2030 │ 0160 │ 2039 │ 0152 │      │ 017D │      │
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
     9… │      │  ‘   │   ’  │   “  │   ”  │   •  │   –  │   —  │   ˜  │   ™  │   š  │   ›  │   œ  │      │   ž  │   Ÿ  │
Unicode │      │ 2018 │ 2019 │ 201C │ 201D │ 2022 │ 2013 │ 2014 │ 02DC │ 2122 │ 0161 │ 203A │ 0153 │      │ 017E │ 0178 │

A diferencia de Windows-1252 rango 0x80 0 0x9F se utiliza para Códigos de control en ISO-8859-1.

Esta tabla muestra las diferencias entre Windows-1252, ISO-8859-1 e ISO-8859-15

Character    │    € │   Š │   š │   Ž │   ž │   Œ │   œ │   Ÿ │  ¤ │  ¦ │  ¨ │  ´ │  ¸ │  ¼ │  ½ │  ¾ │
───────────────────────────────────────────────────────────────────────────────────────────────────────
ISO 8859-1   │    – │   – │   – │   – │   – │   – │   – │   – │ A4 │ A6 │ A8 │ B4 │ B8 │ BC │ BD │ BE │
ISO 8859-15  │   A4 │  A6 │  A8 │  B4 │  B8 │  BC │  BD │  BE │  – │  – │  – │  – │  – │  – │  – │  – │
Windows-1252 │   80 │  8A │  9A │  8E │  9E │  8C │  9C │  9F │ A4 │ A6 │ A8 │ B4 │ B8 │ BC │ BD │ BE │
Unicode      │ 20AC │ 160 │ 161 │ 17D │ 17E │ 152 │ 153 │ 178 │ A4 │ A6 │ A8 │ B4 │ B8 │ BC │ BD │ BE │
 0
Author: Wernfried Domscheit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-22 15:14:50