Pregunta

Tengo un archivo ASCII que contiene un EM Dash (- o & amp; mdash; 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 & amp; # 151; en HTML. Sin embargo, cuando pasamos este archivo a través de una aplicación diferente, convierte el carácter a 0xE28094 o & amp; # 8212; .

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

¿Fue útil?

Solución

& amp; # 151; Está Mal. Cuando usa referencias de caracteres numéricos, el número se refiere al punto de código Unicode. Para números por debajo de 256, 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 guión o cualquier otro carácter visible.

La confusión surge porque el carácter 151 es un guión 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 (128 a 159) son diferentes.

La primera aplicación está leyendo su archivo "ASCII" * como ISO-8859-1, pero en realidad es probablemente cp1252 y necesitará una forma de darle pistas a la aplicación sobre qué codificación tiene que esperar.

(*: "ASCII" es un nombre incorrecto si hay caracteres de conjunto de bits superiores en el archivo. Probablemente se refiera a "ANSI", que en realidad también es un nombre inapropiado, pero que se ha quedado en el mundo de Windows para significar "Texto codificado en la página de códigos predeterminada del sistema actual".)

Otros consejos

  • & amp; # 151; no es em dash , su texto fue mal traducido de em dash a ese valor.
  • & amp; # 8212; es la entidad decimal HTML para el tablero de em. Específicamente está haciendo referencia al punto de código Unicode 8212 que representa un guión em.
  • Su archivo no es ASCII si contiene un guión em. Los caracteres ASCII solo codifican al rango decimal 0 - 127, y el guión largo no es un carácter que pueda representarse mediante codificación ASCII. Si tiene un guión em almacenado como 0x97 (151 en decimal), probablemente tenga un archivo de texto ANSI (también conocido como Windows Codepage 1252 (w-1252)).

Tu primera aplicación ...
Los datos comenzaron como un guión em codificado en w-1252. En w-1252, el guión em se asigna al valor decimal 151 (0x97 en hexadecimal o 10010111 en binario).

En algún momento, el guión em fue manejado por un código que pensaba que los bytes en su archivo eran texto codificado iso-8859-1. Cuando ese código interpretaba 0x97 como una cadena / char, asignó 0x97 a un carácter según la codificación iso-8859-1 . En iso-8859-1 0x97 se asigna al carácter "Fin del área protegida".

A continuación, la cadena, que el código cree que es el " Fin del área protegida " control char, fue codificado como utf-8. " Fin del área protegida " codificado en utf-8 está la secuencia de dos bytes: 0xC2 0x97 .

Tu segunda aplicación ...
El archivo de texto se interpretó correctamente como w-1252, por lo que el 0x97 se reconoce como em dash, que se codificó correctamente como em dash en utf-8: 0xE2 0x80 0x94.

Qué influye en este comportamiento
No estoy seguro de si se trata de aplicaciones web o qué, pero el concepto debería 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 conjunto de caracteres de la página web se declaró como iso8859-1, y la mejor manera del navegador para manejar los caracteres w1252 era simplemente enviarlos como bytes iso sin alertar al usuario o al servidor. El servidor recibe los datos que piensa que son iso y los convierte a utf-8, lo que resulta en 0xC297.

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

De acuerdo con la referencia de entidad de carácter de la especificación HTML4 , el emdash es & amp; # 8212; ( U + 2014 ).

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 alguna otra codificación de un solo byte. La codificación de Windows-1250, por ejemplo, tiene el em-dash en 0x97.

Si las aplicaciones decodifican el archivo de texto usando otra codificación que no sea la que se utilizó para crear el archivo, cualquier carácter superior a 0x7F será incorrecto.

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

Carácter Unicode 'EM DASH' (U + 2014)

En una página web que, por ejemplo, utiliza Windows-1250 como codificación, el código & amp; # 151; se representará como un guión em:

<!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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top