В чем разница между EM Dash #151;и #8212;?
Вопрос
У меня есть файл ASCII, который содержит тире EM (- или —
в HTML).Шестнадцатеричное значение равно 0x97.Когда мы передаем этот файл через одно приложение, он поступает как UTF-8, и он преобразует символ в 0xC297, который является —
в HTML.Однако, когда мы передаем этот файл через другое приложение, он преобразует символ в 0xE28094 или —
.
Что могло бы заставить эти приложения преобразовывать эти символы по-разному?Возможно, это настройка кодовой страницы?
Решение
это неправильно.Когда вы используете числовые ссылки на символы, число относится к кодовой точке Unicode.Для чисел ниже 256 это совпадает с кодовой точкой в ISO-8859-1.В 8859-1 символ 151 входит в число "управляющих кодов C1”, а не тире или любой другой видимый символ.
Путаница возникает из-за того, что символ 151 является тире на кодовой странице Windows 1252 (западноевропейская).Многие люди думают, что cp1252 - это то же самое, что ISO-8859-1, но на самом деле это не так:символы в диапазоне C1 (от 128 до 159) отличаются.
Первое приложение считывает ваш файл “ASCII” * как ISO-8859-1, но на самом деле это, вероятно, cp1252, и вам понадобится способ подсказать приложению, какую кодировку оно должно ожидать.
(*:“ASCII” является неправильным обозначением, если в файле есть символы с начальным разрядом.Вероятно, вы имеете в виду “ANSI”, что на самом деле тоже неправильное название, но оно закрепилось в мире Windows и означает “текст, закодированный на текущей кодовой странице системы по умолчанию”.)
Другие советы
—
это не эм дэш, ваш текст был неправильно переведен из em dash в это значение.—
является десятичной сущностью HTML для em dash.В частности, это ссылка на кодовую точку 8212 в Юникоде, которая представляет собой тире em.- Ваш файл не является ASCII, если он содержит тире em.Символы ASCII кодируются только в десятичном диапазоне от 0 до 127, а тире - это не тот символ, который может быть представлен в кодировке ASCII.Если у вас em dash сохранен как 0x97 (151 в десятичной системе счисления), у вас, вероятно, есть текстовый файл ANSI (он же кодовая страница Windows 1252 (w-1252)).
Ваше первое приложение...
Данные начинались с тире em, закодированного в w-1252.В w-1252 тире em соответствует десятичному значению 151 (0x97 в шестнадцатеричном формате или 10010111 в двоичном).
В какой-то момент em dash был обработан кодом, который думал, что байты в вашем файле представляют собой текст в кодировке iso-8859-1.Когда этот код интерпретирует 0x97 как строку / char, он сопоставил 0x97 с символом в соответствии с кодировкой iso-8859-1.В iso-8859-1 0x97 соответствует символу "Конец охраняемой зоны".
Далее, строка, которая, по мнению кода, является управляющим символом "Конец охраняемой зоны", была закодирована как utf-8. "Конец охраняемой зоны", закодированный в utf-8, представляет собой двухбайтовую последовательность:0xC2 0x97.
Ваше второе приложение...
Текстовый файл был правильно интерпретирован как w-1252, таким образом, 0x97 распознается как em dash, который был правильно закодирован как em dash в utf-8:0xE2 0x80 0x94.
Что влияет на это поведение
Не уверен, имеете ли вы дело с веб-приложениями или с чем-то еще, но концепция должна быть одинаковой, что бы это ни было.У нас был тот же сценарий 0x97-> 0xC297 в веб-приложении, где люди вводят данные в форму.Я обнаружил, что кодировка веб-страницы была объявлена как iso8859-1, и лучшим способом браузера для обработки символов w1252 было просто отправить их вместе с байтами iso без предупреждения пользователя или сервера.Сервер получает данные, думая, что это iso, и преобразует их в utf-8, в результате чего получается 0xC297.
По сути, каждый раз, когда приложение прикасается к тексту, ему необходимо сообщить, как кодируется текст, иначе он может вернуться к системному значению по умолчанию.Если это произойдет, вы рискуете повредить данные.
Согласно справочнику по символам спецификации HTML4. emdash - & amp; # 8212; ( U + 2014 ).
Файл ASCII не может содержать символ 0x97, поскольку набор символов ASCII находится в диапазоне от 0x00 до 0x7F. Следовательно, ваш файл не ASCII, а какая-то другая однобайтовая кодировка. Например, кодировка windows-1250 имеет тире em в 0x97.
Если приложения декодируют текстовый файл, используя другую кодировку, отличную от той, которая использовалась для создания файла, любой символ выше 0x7F будет неправильным.
В юникоде у тире есть код символа 0x2014 или 8212 в десятичном виде.