В чем разница между EM Dash # 151; и # 8212;?
У меня есть файл ASCII, содержащий EM Dash (- или —
в HTML). Значение hex равно 0x97. Когда мы передаем этот файл через одно приложение, он появляется как UTF-8, и он преобразует символ в 0xC297, который является —
в HTML. Однако, когда мы передаем этот файл через другое приложение, он преобразует символ в 0xE28094 или —
.
Что может заставить эти приложения по-разному преобразовывать эти символы? Возможно, это настройка кодовой страницы?
Ответы
Ответ 1
& # 151; неправильно. Когда вы используете числовые ссылки на символы, это число относится к кодовому номеру 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, означает "текст закодирован на текущей кодовой странице по умолчанию".)
Ответ 2
-
—
не находится в тире, ваш текст был неправильно переведен с em dash на это значение.
-
—
- это десятичная сущность HTML для em dash. В частности, это ссылка на кодовую точку 8212 Unicode, которая представляет собой тире em.
- Ваш файл не является ASCII, если он содержит тире em. Символы ASCII кодируются только в десятичном диапазоне 0 - 127, а em dash не является символом, который может быть представлен кодировкой ASCII. Если у вас есть тире, хранящаяся как 0x97 (151 в десятичной форме), у вас, вероятно, есть текстовый файл ANSI (он же Windows Codepage 1252 (w-1252)).
Ваше первое приложение...
Данные начинались как em dash, закодированные в w-1252. В w-1252 em dash отображает десятичное значение 151 (0x97 в шестнадцатеричном виде или 10010111 в двоичном формате).
В какой-то момент em dash обрабатывался кодом, который считал, что байты в вашем файле были кодированным кодом iso-8859-1. Когда этот код интерпретировал 0x97 как строку / char, он сопоставил 0x97 с символом в соответствии с кодировкой iso-8859-1. В iso-8859-1 0x97 отображается карта char "Конец защищенной области".
Далее строка, которую код считает элементом управления "Конец охраняемой области" char, была закодирована как 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.
В принципе, в любое время, когда приложение касается текста, ему нужно сообщить, как кодируется текст, иначе он может вернуться к системному стандарту. Если это произойдет, вы рискуете повреждением данных.
Ответ 3
В соответствии со спецификацией HTML4 ссылка на символ символа, emdash is & # 8212; (U + 2014).
Ответ 4
Файл ASCII не может содержать символ 0x97, так как набор символов ASCII находится только от 0x00 до 0x7F. Следовательно, ваш файл не является ASCII, а некоторым другим однобайтовым кодированием. Например, в кодировке windows-1250 есть em-тире в 0x97.
Если приложения декодируют текстовый файл с использованием какой-либо другой кодировки, чем тот, который использовался для создания файла, любой символ выше 0x7F будет неправильным.
В юникоде em-dash имеет код символа 0x2014 или 8212 в десятичной форме.
Unicode Character 'EM DASH' (U + 2014)
На веб-странице, которая, например, использует Windows-1250 в качестве кодировки, код —
будет отображаться как em-dash:
<!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>—</div>
</body>
</html>