В чем разница между EM Dash # 151; и # 8212 ;? - PullRequest
28 голосов
/ 10 марта 2009

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

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

Ответы [ 4 ]

39 голосов
/ 10 марта 2009

- неправильно. Когда вы используете числовые ссылки на символы, число относится к кодовой точке Unicode. Для чисел ниже 256 это то же самое, что и кодовая точка в ISO-8859-1. В 8859-1 символ 151 входит в число «управляющих кодов С1», а не тире или любой другой видимый символ.

Путаница возникает из-за того, что символ 151 является чертой в кодовой странице Windows 1252 (западноевропейский). Многие думают, что cp1252 - это то же самое, что и ISO-8859-1, но на самом деле это не так: символы в диапазоне C1 (от 128 до 159) отличаются.

Первое приложение читает ваш файл «ASCII» * как ISO-8859-1, но на самом деле это, вероятно, cp1252, и вам понадобится способ понять, какую кодировку оно должно ожидать.

(*: «ASCII» - это неправильное выражение, если в файле есть символы с верхним битом. Вы, вероятно, имеете в виду «ANSI», что на самом деле также является неправильным, но слово, которое застряло в мире Windows, означает «Текст, закодированный в текущей системной кодовой странице по умолчанию».)

17 голосов
/ 07 января 2010
  • — - это не 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.

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

5 голосов
/ 10 марта 2009

Файл ASCII не может содержать символ 0x97, поскольку набор символов ASCII находится в диапазоне от 0x00 до 0x7F. Следовательно, ваш файл не ASCII, а какая-то другая однобайтовая кодировка. Например, кодировка windows-1250 имеет тире em в 0x97.

Если приложения декодируют текстовый файл, используя другую кодировку, отличную от той, которая использовалась для создания файла, любой символ выше 0x7F будет неправильным.

В юникоде у тире есть код символа 0x2014 или 8212 в десятичном виде.

Unicode-символ «EM DASH» (U + 2014)

На веб-странице, которая, например, использует Windows-1250 в качестве кодировки, код — будет отображаться как тире:

<!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>
5 голосов
/ 10 марта 2009
...