Что является различием между Длинным тире № 151; и № 8212;?

cout << "Enter the number: ";
int number;
cin >> number;

cin.ignore(256, '\n'); // remaining input characters up to the next newline character
                       // are ignored

cout << "Enter names: ";
string names;
getline(cin, names);
29
задан SilentGhost 10 March 2009 в 17:35
поделиться

4 ответа

& #151; является неправильным. При использовании ссылок цифрового символа число относится к кодовой точке Unicode. Для чисел ниже 256, который совпадает с кодовой точкой в ISO-8859-1. В 8859-1, символ 151 среди codes” управления “C1, и не тире или любого другого видимого символа.

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

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

(*: “ASCII” является неправильным употреблением, если существуют символы главного набора битов в файле. Вы, вероятно, имеете в виду “ANSI”, который является действительно также неправильным употреблением, но тот, который всунул мир Windows для значения “text, закодированного в текущем системном значении по умолчанию, кодирует page”.)

39
ответ дан bobince 14 October 2019 в 07:35
поделиться

ASCII-файл не может содержать символ 0x97, поскольку набор символов ASCII только колеблется от 0x00 до 0x7F. Поэтому Ваш файл не является ASCII, но некоторым другим единственным кодированием байта. Окна 1250, кодирующий, например, имеют длинное тире в 0x97.

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

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

Символ Unicode ИХ ПОДЧЕРКИВАЕТ ШТРИХОВОЙ ЛИНИЕЙ' (U+2014)

В веб-странице, которая, например, использует окна 1250 в качестве кодирования, код &#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>
5
ответ дан Guffa 14 October 2019 в 07:35
поделиться

Согласно ссылке символьной сущности спецификации HTML4 , emdash является & #8212; ( U+2014).

5
ответ дан Powerlord 14 October 2019 в 07:35
поделиться
  • не является em dash, ваш текст был неправильно переведен из em dash в это значение.
  • является десятичной сущностью HTML для em dash. В частности, это ссылка на точку кода Юникода 8212, которая представляет собой тире em.
  • Ваш файл не является ASCII, если он содержит тире em. ASCII символы кодируются только в десятичном диапазоне 0 - 127, и em тире не является символом, который может быть представлен кодировкой ASCII. Если em тире хранится как 0x97 (151 в десятичном значении), то, скорее всего, у вас есть текстовый файл ANSI (также известный как Windows Codepage 1252 (w-1252)).

Ваше первое приложение...
Данные начинаются с тире в кодировке w-1252. В w-1252 тире em отображает десятичное значение 151 (0x97 в шестнадцатеричной форме, или 10010111 в двоичной).

В какой-то момент тире em было обработано кодом, который считал, что байты в Вашем файле - это текст в кодировке 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.

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

18
ответ дан 28 November 2019 в 01:12
поделиться