Подтвердить что ты не робот

В чем разница между EM Dash # 151; и # 8212;?

У меня есть файл ASCII, содержащий EM Dash (- или — в HTML). Значение hex равно 0x97. Когда мы передаем этот файл через одно приложение, он появляется как UTF-8, и он преобразует символ в 0xC297, который является — в HTML. Однако, когда мы передаем этот файл через другое приложение, он преобразует символ в 0xE28094 или —.

Что может заставить эти приложения по-разному преобразовывать эти символы? Возможно, это настройка кодовой страницы?

4b9b3361

Ответ 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.

В принципе, в любое время, когда приложение касается текста, ему нужно сообщить, как кодируется текст, иначе он может вернуться к системному стандарту. Если это произойдет, вы рискуете повреждением данных.

Ответ 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>&#151;</div>
</body>
</html>