—
is not em dash, su texto fue mis-traducidos del guión largo a ese valor.
—
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.