2009-03-10 19 views
25

Tengo un archivo ASCII que contiene un Dash EM (- o — en HTML). El valor hexadecimal es 0x97. Cuando pasamos este archivo a través de una aplicación, llega como UTF-8 y convierte el carácter a 0xC297, que es — en HTML. Sin embargo, cuando pasamos este archivo a través de una aplicación diferente, convierte el carácter a 0xE28094 o —.Cuál es la diferencia entre EM Dash # 151; y # 8212 ;?

¿Qué causaría que estas aplicaciones convirtieran estos caracteres de manera diferente? ¿Es quizás una configuración de página de códigos?

Respuesta

34

& # 151; Está Mal. Cuando utiliza referencias de caracteres numéricos, el número se refiere al punto de código Unicode. Para números debajo de 256 que es lo mismo que el punto de código en ISO-8859-1. En 8859-1, el carácter 151 se encuentra entre los "códigos de control C1", y no un guion o cualquier otro carácter visible.

La confusión surge porque el carácter 151 es un guion en la página de códigos de Windows 1252 (Europa occidental). Mucha gente piensa que cp1252 es lo mismo que ISO-8859-1, pero en realidad no lo es: los caracteres en el rango C1 (de 128 a 159) son diferentes.

La primera aplicación es leer su archivo "ASCII" * como ISO-8859-1, pero en realidad es probablemente cp1252 y necesitará una forma de localizar la aplicación para saber qué codificación espera.

(*: "ASCII" es un nombre inapropiado si hay caracteres de primer bit en el archivo. Probablemente se refiera a "ANSI", que también es un nombre inapropiado, pero que se ha quedado en el mundo de Windows a significa “texto codificado en la página de códigos actual del sistema por defecto”.)

5

Un archivo ASCII no puede contener el carácter 0x97, ya que el conjunto de caracteres ASCII solo varía de 0x00 a 0x7F. Por lo tanto, su archivo no es ASCII, sino otra codificación de un solo byte. La codificación windows-1250 por ejemplo tiene el em-dash en 0x97.

Si las aplicaciones decodifican el archivo de texto utilizando alguna otra codificación distinta a la que se usó para crear el archivo, cualquier carácter por encima de 0x7F será incorrecto.

En unicode, el em-dash tiene el código de carácter 0x2014, o 8212 en decimal.

Unicode Character 'EM DASH' (U+2014)

En una página web que, por ejemplo, utiliza ventanas-1250 como la codificación, el código — representará como un guión largo:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>em-dash</title> 
    <meta http-equiv="content-type" content="text/html; charset=windows-1250"/> 
</head> 
<body> 
    <div>&#151;</div> 
</body> 
</html> 
14
  • &#151; is not em dash, su texto fue mis-traducidos del guión largo a ese valor.
  • &#8212; es la entidad HTML decimal para em dash. Específicamente, hace referencia al punto de código Unicode 8212 que representa un em dash.
  • Su archivo no es ASCII si contiene un em dash. Los caracteres ASCII solo codifican en un rango decimal de 0 a 127, y em dash no es un carácter que pueda representarse mediante codificación ASCII. Si tienes un dash almacenado como 0x97 (151 en decimal) probablemente tengas un archivo de texto ANSI (también conocido como Windows Codepage 1252 (w-1252)).

Su primera aplicación ...
Los datos comenzaron como un em dash codificado en w-1252. En w-1252, el tablero de instrumentos se correlaciona con el valor decimal 151 (0x97 en hexadecimal o 10010111 en binario).

En algún punto, el em dash fue manejado por código que pensó que los bytes en su archivo eran texto codificado iso-8859-1. Cuando ese código interpretó 0x97 como una cadena/charlo mapped 0x97 to a character according to the iso-8859-1 encoding. En iso-8859-1 0x97 se asigna al char "Fin del área protegida".

A continuación, la cadena, que el código cree que es el carácter de control "Fin de área protegida", se codificó como utf-8. "End of guarded area" encoded in utf-8 is the two-byte sequence: 0xC2 0x97.

Su segunda aplicación ...
El archivo de texto se interpretó correctamente como w-1252, de este modo se reconoce el 0x97 como guión largo, que fue correctamente codificado como el guión largo en UTF-8: 0xE2 0x80 0x94 .

Lo que influye en este comportamiento
No estoy seguro si usted está tratando con aplicaciones web o qué, pero el concepto debe ser el mismo sea lo que sea. Tuvimos el mismo escenario 0x97-> 0xC297 en una aplicación web donde las personas ingresan datos en un formulario. Descubrí que el juego de caracteres de la página web se declaró como iso8859-1 y que la mejor manera de manejar los caracteres w1252 del navegador era simplemente enviarlos como bytes iso sin alertar al usuario o al servidor. El servidor recibe los datos cree que es iso y se convierte a utf-8, lo que resulta en 0xC297.

Básicamente, cada vez que una aplicación toca el texto, necesita que se le diga cómo se codifica el texto, o de lo contrario podría caer en un sistema predeterminado. Si eso sucede, corre el riesgo de corrupción de datos.

Cuestiones relacionadas