Вопрос

У меня есть файл 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 в десятичном виде.

Символ Unicode 'EM DASH' (U + 2014)

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

<!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>
scroll top