—
- это не em dash , ваш текст был неправильно переведен с em dash на это значение.
—
- десятичная сущность HTML для em dash. В частности, это ссылка на кодовую точку Unicode 8212, которая представляет собой тире.
- Ваш файл не является ASCII, если он содержит тире. Символы ASCII кодируются только в десятичном диапазоне от 0 до 127, и em dash не является символом, который может быть представлен кодировкой ASCII. Если вы храните em dash как 0x97 (151 в десятичном формате), у вас, вероятно, есть текстовый файл ANSI (он же кодовая страница Windows 1252 (w-1252)).
Ваше первое приложение ...
Данные начинались как тире, закодированный в w-1252. В w-1252 знак тире em соответствует десятичному значению 151 (0x97 в шестнадцатеричном или 10010111 в двоичном виде).
В какой-то момент точка тире была обработана кодом, который думал, что байты в вашем файле были зашифрованными в iso-8859-1. Когда этот код интерпретировал 0x97 как строку / символ, он отобразил 0x97 в символ в соответствии с кодировкой iso-8859-1 . В iso-8859-1 0x97 карты для символа "Конец охраняемой территории".
Затем строка, которую код считает контрольным символом «Конец охраняемой области», была закодирована как utf-8. «Конец охраняемой области», закодированный в utf-8, представляет собой двухбайтовую последовательность: 0xC2 0x97 .
Ваше второе приложение ...
Текстовый файл был правильно интерпретирован как w-1252, поэтому 0x97 распознается как тире em, который был правильно закодирован как тире em в utf-8: 0xE2 0x80 0x94.
Что влияет на это поведение
Не уверен, имеете ли вы дело с веб-приложениями или чем-то, но концепция должна быть такой же, какой бы она ни была. У нас был такой же сценарий 0x97-> 0xC297 в веб-приложении, где люди вводили данные в форму. Я обнаружил, что кодировка веб-страницы была объявлена как iso8859-1, и лучший способ обработки символов w1252 в браузере состоял в том, чтобы просто отправлять их как iso-байты без предупреждения пользователя или сервера. Сервер получает данные, считает, что это iso, и преобразует их в utf-8, в результате чего получается 0xC297.
Как правило, каждый раз, когда приложение касается текста, ему нужно сообщить, как кодируется текст, иначе оно может вернуться к системному значению по умолчанию. Если это произойдет, вы рискуете испортить данные.