Задание 1 — Решение заданий ЕГЭ по информатике
Кодирование и декодирование информации
Кодирование в различных системах счисления
№1. Для кодирования букв О, В, Д, П, А решили использовать двоичное представление чисел 0, 1, 2, 3 и 4 соответственно (с сохранением одного незначащего нуля в случае одноразрядного представления). Если закодировать последовательность букв ВОДОПАД таким способом и результат записать восьмеричным кодом, то получится
1) 22162
2) 1020342
3) 2131453
4) 34017
Пояснение.
Сначала следует представить данные в условии числа в двоичном коде:
О | В | Д | П | А |
0 | 1 | 2 | 3 | 4 |
01 | 10 | 11 | 100 |
Затем закодировать последовательность букв: ВОДОПАД — 010010001110010. Теперь разобьём это представление на тройки справа налево и переведём полученный набор чисел в десятичный код, затем в восьмеричный (восьмеричное предствление совпадает с десятичным при разбиении тройками)
010 010 001 110 010 — 22162.
Правильный ответ указан под номером 1.
№2. Для кодирования букв Д, X, Р, О, В решили использовать двоичное представление чисел 0, 1, 2, 3 и 4 соответственно (с сохранением одного незначащего нуля в случае одноразрядного представления). Если закодировать последовательность букв ХОРОВОД таким способом и результат записать восьмеричным кодом, то получится
1) 12334
2) 2434541
3) 36714
4) 1323430
Пояснение.
Сначала следует представить данные в условии числа в двоичном коде:
Д | Х | Р | О | В |
0 | 1 | 2 | 3 | 4 |
00 | 01 | 10 | 11 | 100 |
Затем закодировать последовательность букв: ХОРОВОД — 011110111001100. Теперь разобьём это представление на тройки справа налево и переведём полученный набор чисел в десятичный код, затем в восьмеричный (восьмеричное предствление совпадает с десятичным при разбиении тройками)
011 110 111 001 100 — 36714.
Правильный отвте указан под номером 3.
№3. Для кодирования букв О, К, Г, Д, Р решили использовать двоичное представление чисел 0, 1, 2, 3 и 4 соответственно (с сохранением одного незначащего нуля в случае одноразрядного представления). Если закодировать последовательность букв ГОРОДОК таким способом и результат записать восьмеричным кодом, то получится
1) 2040301
2) 16024
3) 1030402
4) 42061
Пояснение.
Сначала следует представить данные в условии числа в двоичном коде:
О | К | Г | Д | Р |
0 | 1 | 2 | 3 | 4 |
00 | 01 | 10 | 11 | 100 |
Затем закодировать последовательность букв: ГОРОДОК — 100010000110001. Теперь разобьём это представление на тройки справа налево и переведём полученный набор чисел в десятичный код, затем в восьмеричный (восьмеричное предствление совпадает с десятичным при разбиении тройками)
100 010 000 110 001 — 42061.
Правильный отвте указан под номером 4.
№4. Для кодирования букв X, Е, Л, О, Д решили использовать двоичное представление чисел 0, 1, 2, 3 и 4 соответственно (с сохранением одного незначащего нуля в случае одноразрядного представления). Если закодировать последовательность букв ЛЕДОХОД таким способом и результат записать шестнадцатеричным кодом, то получится
1) 999С
2) 3254145
3) 123F
4) 2143034
Пояснение.
Сначала следует представить данные в условии числа в двоичном коде:
Х | Е | Л | О | Д |
0 | 1 | 2 | 3 | 4 |
00 | 01 | 10 | 11 | 100 |
Затем закодировать последовательность букв: ЛЕДОХОД — 1001100110011100. Теперь разобьём это представление на четвёрки справа налево и переведём полученный набор чисел cначала в десятичный код, затем в шестнадцатеричный.
1001 1001 1001 1100 — 9 9 9 12 — 999С.
Правильный ответ указан под номером 1.
№5. Для кодирования букв И, Д, Т, О, X решили использовать двоичное представление чисел 0, 1, 2, 3 и 4 соответственно (с сохранением одного незначащего нуля в случае одноразрядного представления). Если закодировать последовательность букв ТИХОХОД таким способом и результат записать шестнадцатеричным кодом, то получится
1) CD89
2) 89CD
3) 3154542
4) 2043431
Пояснение.
Сначала следует представить данные в условии числа в двоичном коде:
И | Д | Т | О | Х |
0 | 1 | 2 | 3 | 4 |
00 | 01 | 10 | 11 | 100 |
Затем закодировать последовательность букв: ТИХОХОД — 1000100111001101. Теперь разобьём это представление на четвёрки справа налево и переведём полученный набор чисел cначала в десятичный код, затем в шестнадцатеричный.
1000 1001 1100 1101 — 8 9 12 13 — 89СD.
Правильный ответ указан под номером 2.
№6. Для кодирования букв Р, С, Н, О, Г решили использовать двоичное представление чисел 0, 1, 2, 3 и 4 соответственно (с сохранением одного незначащего нуля в случае одноразрядного представления). Если закодировать последовательность букв НОСОРОГ таким способом и результат записать восьмеричным кодом, то получится
1) 3424145
2) 2313034
3) 55634
4) 33100
Пояснение.
Сначала следует представить данные в условии числа в двоичном коде:
Р | С | Н | О | Г |
0 | 1 | 2 | 3 | 4 |
00 | 01 | 10 | 11 | 100 |
Затем закодировать последовательность букв: НОСОРОГ — 101101110011100. Теперь разобьём это представление на тройки справа налево и переведём полученный набор чисел в десятичный код (при представлении двоичными тройками восьмеричный код совпадает с десятичным)
101 101 110 011 100 — 55634.
Правильный ответ указан под номером 3.
№7. Для кодирования букв Е, П, Н, Ч, Ь решили использовать двоичное представление чисел 0, 1, 2, 3 и 4 соответственно (с сохранением одного незначащего нуля в случае одноразрядного представления). Если закодировать последовательность букв ПЕЧЕНЬЕ таким способом и результат записать восьмеричным кодом, то получится
1) 1030240
2) 12017
3) 2141351
4) 23120
Пояснение.
Сначала следует представить данные в условии числа в двоичном коде:
Е | П | Н | Ч | Ь |
0 | 1 | 2 | 3 | 4 |
000 | 001 | 010 | 011 | 100 |
Затем закодировать последовательность букв: ПЕЧЕНЬЕ — 010011001010000. Теперь разобьём это представление на тройки справа налево и переведём полученный набор чисел в десятичный код (при представлении двоичными тройками восьмеричный код совпадает с десятичным)
010 011 001 010 000 — 23120.
Правильный ответ указан под номером 4.
№8. Для кодирования букв О, Ч, Б, А, К решили использовать двоичное представление чисел 0, 1, 2, 3 и 4 соответственно (с сохранением одного незначащего нуля в случае одноразрядного представления). Если закодировать последовательность букв КАБАЧОК таким способом и результат записать шестнадцатеричным кодом, то получится
1) 5434215
2) 9DA4
3) ABCD
4) 4323104
Пояснение.
Сначала следует представить данные в условии числа в двоичном коде:
О | Ч | Б | А | К |
0 | 1 | 2 | 3 | 4 |
00 | 01 | 10 | 11 | 100 |
Затем закодировать последовательность букв: КАБАЧОК — 1001110110100100. Теперь разобьём это представление на четвёрки справа налево и переведём полученный набор чисел сначала в десятичный код, затем в шестнадцатеричный:
1001 1101 1010 0100 — 9 13 10 4 — 9DA4.
Правильный ответ указан под номером 2.
№9. Для кодирования букв Р, И, К, П, А решили использовать двоичное представление чисел 0, 1, 2, 3 и 4 соответственно (с сохранением одного незначащего нуля в случае одноразрядного представления). Если закодировать последовательность букв ПАПРИКА таким способом и результат записать шестнадцатеричным кодом, то получится
1) Е634
2) А1В2
3) А45412А
4) 3430124
Пояснение.
Сначала следует представить данные в условии числа в двоичном коде:
Р | И | К | П | А |
0 | 1 | 2 | 3 | 4 |
00 | 01 | 10 | 11 | 100 |
Затем закодировать последовательность букв: ПАПРИКА — 1110011000110100. Теперь разобьём это представление на четвёрки справа налево и переведём полученный набор чисел сначала в десятичный код, затем в шестнадцатеричный:
1110 0110 0011 0100 — 14 6 3 4 — E634.
Правильный ответ указан под номером 1.
№10. Для кодирования букв О, Л, А, 3, К решили использовать двоичное представление чисел 0, 1, 2, 3 и 4 соответственно (с сохранением одного незначащего нуля в случае одноразрядного представления). Если закодировать последовательность букв ЗАКОЛКА таким способом и результат записать шестнадцатеричным кодом, то получится
1) 4351253
2) 9876
3) Е832
4) 3240143
Пояснение.
Сначала следует представить данные в условии числа в двоичном коде:
О | Л | А | З | К |
0 | 1 | 2 | 3 | 4 |
00 | 01 | 10 | 11 | 100 |
Затем закодировать последовательность букв: ЗАКОЛКА — 1110100000110010. Теперь разобьём это представление на четвёрки справа налево и переведём полученный набор чисел сначала в десятичный код, затем в шестнадцатеричный:
1110 1000 0011 0010 — 14 8 3 2 — E832.
Правильный ответ указан под номером 3.
Расшифровка сообщений
№1. Для 5 букв латинского алфавита заданы их двоичные коды (для некоторых букв — из двух бит, для некоторых — из трех). Эти коды представлены в таблице:
a | b | c | d | e |
000 | 110 | 01 | 001 | 10 |
Определите, какой набор букв закодирован двоичной строкой 1100000100110
1) baade
2) badde
3) bacde
4) bacdb
Пояснение.
Мы видим, что выполняется условие Фано: никакое кодовое слово не является началом другого кодового слова, поэтому однозначно можем раскодировать сообщение с начала.
Разобьём код слева направо по данным таблицы и переведём его в буквы:
110 000 01 001 10 — b a c d e.
Правильный ответ указан под номером 3.
№2. Для 5 букв латинского алфавита заданы их двоичные коды (для некоторых букв – из двух бит, для некоторых – из трех). Эти коды представлены в таблице:
a b c d e
100 110 011 01 10
Определите, какой набор букв закодирован двоичной строкой 1000110110110, если известно, что все буквы в последовательности – разные:
1) cbade
2) acdeb
3) acbed
4) bacde
Пояснение.
Мы видим, что условия Фано и обратное условие Фано не выполняются, значит код можно раскодировать неоднозначно.
Будем пробовать разные варианты, отбрасывая те, в которых получаются повторяющиеся буквы:
1) 100 011 01 10 110
Первая буква определяется однозначно, её код 100: a.
Пусть вторая буква — с, тогда следующая буква — d, потом — e и b.
Такой вариант удовлетворет условию, значит, окончательно получили ответ: acdeb.
Правильный ответ указан под номером 2.
№3. Для 6 букв латинского алфавита заданы их двоичные коды (для некоторых букв из двух бит, для некоторых – из трех). Эти коды представлены в таблице:
A | B | C | D | E | F |
00 | 100 | 10 | 011 | 11 | 101 |
Определите, какая последовательность из 6 букв закодирована двоичной строкой 011111000101100.
1) DEFBAC
2) ABDEFC
3) DECAFB
4) EFCABD
Пояснение.
Мы видим, что условия Фано и обратное условие Фано не выполняются, значит код можно раскодировать неоднозначно.
Будем пробовать разные варианты, отбрасывая те, в которых получаются повторяющиеся буквы:
1) 011 11 100 0101100
Первая буква определяется однозначно, её код 011: D.
Вторая буква также определится однозначно — E.
Пусть третья буква B, тогда следующая начинается с кода 010, но таких букв в таблице нет, значит предположение не верно.
2) 011 11 10 00 101 100
Третья буква — С, потом — A. Мы хотим получить ещё две буквы, чтобы в сумме их было 6, тогда следующая буква — F, и последняя — B.
Окончательно получили ответ: DECAFB.
Правильный ответ указан под номером 3.
№4. Для кодирования сообщения, состоящего только из букв О, К, Л, М и Б, используется неравномерный по длине двоичный код:
О | К | Л | М | Б |
00 | 01 | 11 | 010 | 0110 |
Какое (только одно!) из четырех полученных сообщений было передано без ошибок и может быть раскодировано:
1) 110001001001110
2) 10000011000111010
3) 110001001101001
4) 1000110001100010
Пояснение.
Разобьём каждый ответ на посимвольный код и найдём нужный вариант:
Вариант 1: 11 00 010 01 00 11 10 — при таком разбиении последняя часть кода не может быть раскодирована, а если разбить по-другому 11 00 01 00 10011, то сообщение также недекодируемо.
В вариантах 2 и 4 невозможно раскодировать начало кода.
Вариант 3: 11 00 01 00 11 01 00 1 — при таком разбиении последняя часть кода не может быть раскодирована. Разобьём по-другому: 11 00 01 00 11 010 01 — такой вариант разбиения может быть раскодирован.
.Правильный ответ указан под номером 3.
№5. Для передачи чисел по каналу с помехами используется код проверки четности. Каждая его цифра записывается в двоичном представлении, с добавлением ведущих нулей до длины 4, и к получившейся последовательности дописывается сумма её элементов по модулю 2 (например, если передаём 23, то получим последовательность 0010100110). Определите, какое число передавалось по каналу в виде 01100010100100100110?
1) 6543
2) 62926
3) 62612
4) 3456
Пояснение.
Из примера видно, что 2 знака кодируются 10 двоичными разрядами (битами), на каждую цифру отводится 5 бит. В условии сказано, что каждая цифра записывается кодом длиной 4 знака, значит, пятую цифру можно откинуть.
Разобьём двоичную запись на группы по 5 знаков: 01100 01010 01001 00110. Отбрасываем послеюднюю цифру в каждой пятёрке и первеодим в десятичную запись:
0110 0101 0100 0011 — 6 5 4 3.
Правильный ответ указан под номером 1.
№6. По каналу связи передаются сообщения, содержащие только 5 букв А, И, К, О, Т. Для кодирования букв используется неравномерный двоичный код с такими кодовыми словами:
А — 0, И — 00, К — 10, О — 110, Т — 111.
Среди приведённых ниже слов укажите такое, код которого можно декодировать только одним способом. Если таких слов несколько, укажите первое по алфавиту.
1) КАА
2) ИКОТА
3) КОТ
4) ни одно из сообщений не подходит
Пояснение.
Закодируем каждое слово.
КАА — 1000
ИКОТА — 00101110
КОТ — 10110111
Слово КАА можно декодировать как КИ
Слово ИКОТА можно декодировать как ААКОТА
Слово КОТ никак нельзя декодировать по-другому.
Следовательно, ответ 3.
№7. По каналу связи передаются сообщения, содержащие только 5 букв А, И, К, О, Т. Для кодирования букв используется неравномерный двоичный код с такими кодовыми словами:
А — 0, И — 00, К — 10, О — 110, Т — 111.
Среди приведённых ниже слов укажите такое, код которого можно декодировать только одним способом. Если таких слов несколько, укажите первое по алфавиту.
1) КИОТ
2) КООТ
3) ТААК
4) ни одно из сообщений не подходит
Пояснение.
Закодируем каждое слово.
КИОТ — 1000110111
КООТ — 10110110111
ТААК — 1110010
Слово КИОТ можно декодировать как КAA…
Слово ТААК можно декодировать как TИ…
Слово КООТ никак нельзя декодировать по другому.
Следовательно, ответ 2.
№8. По каналу связи передаются сообщения, содержащие только 4 буквы — П, О, Р, Т. Для кодирования букв используются 5-битовые кодовые слова:
П — 11111, О — 11000, Р — 00100, Т — 00011.
Для этого набора кодовых слов выполнено такое свойство: любые два слова из набора отличаются не менее чем в трёх позициях.
Это свойство важно для расшифровки сообщений при наличии помех (в предположении, что передаваемые биты могут искажаться, но не пропадают). Закодированное сообщение считается принятым корректно, если его длина кратна 5 и каждая пятёрка отличается от некоторого кодового слова не более чем в одной позиции; при этом считается, что пятёрка кодирует соответствующую букву. Например, если принята пятерка 00000, то считается, что передавалась буква Р.
Среди приведённых ниже сообщений найдите то, которое принято корректно, и укажите его расшифровку (пробелы несущественны).
11011 11100 00011 11000 01110
00111 11100 11110 11000 00000
1) ПОТОП
2) РОТОР
3) ТОПОР
4) ни одно из сообщений не принято корректно
Пояснение.
Длина обоих сообщений кратна пяти.
Анализируя первое сообщение «11011 11100 00011 11000 01110», приходим к выводу, что оно принято некорректно, поскольку нет такого слова, которое бы отличалось от слова «01110» только в одной позиции.
Рассмотрим второе сообщение. Учитывая, что каждая пятёрка отличается от некоторого кодового слова не более чем в одной позиции, его возможно расшифровать только как «ТОПОР».
№9. По каналу связи передаются сообщения, содержащие только 4 буквы — П, О, Р, Т. Для кодирования букв используются 5-битовые кодовые слова:
П — 00000, О — 00111, Р — 11011, Т — 11100.
Для этого набора кодовых слов выполнено такое свойство: любые два слова из набора отличаются не менее чем в трёх позициях.
Это свойство важно для расшифровки сообщений при наличии помех (в предположении, что передаваемые биты могут искажаться, но не пропадают). Закодированное сообщение считается принятым корректно, если его длина кратна 5 и каждая пятёрка отличается от некоторого кодового слова не более чем в одной позиции; при этом считается, что пятёрка кодирует соответствующую букву. Например, если принята пятерка 11111, то считается, что передавалась буква Р.
Среди приведённых ниже сообщений найдите то, которое принято корректно, и укажите его расшифровку (пробелы несущественны).
11011 10111 11101 00111 10001
10000 10111 11101 00111 00001
1) ПОТОП
2) РОТОР
3) ТОПОР
4) ни одно из сообщений не принято корректно
Пояснение.
Длина обоих сообщений кратна пяти.
Анализируя первое сообщение «11011 10111 11101 00111 10001», приходим к выводу, что оно принято некорректно, поскольку нет такого слова, которое бы отличалось от слова «10001» только в одной позиции.
Рассмотрим второе сообщение. Учитывая, что каждая пятёрка отличается от некоторого кодового слова не более чем в одной позиции, его возможно расшифровать только как «ПОТОП».
№10. По каналу связи передаются сообщения, содержащие только 4 буквы — П, О, Р, Т. Для кодирования букв используются 5-битовые кодовые слова:
П — 00000, О — 00111, Р — 11011, Т — 11100.
Для этого набора кодовых слов выполнено такое свойство: любые два слова из набора отличаются не менее чем в трёх позициях.
Это свойство важно для расшифровки сообщений при наличии помех (в предположении, что передаваемые биты могут искажаться, но не пропадают). Закодированное сообщение считается принятым корректно, если его длина кратна 5 и каждая пятёрка отличается от некоторого кодового слова не более чем в одной позиции; при этом считается, что пятёрка кодирует соответствующую букву. Например, если принята пятерка 11111, то считается, что передавалась буква Р.
Среди приведённых ниже сообщений найдите то, которое принято корректно, и укажите его расшифровку (пробелы несущественны).
11011 10111 11101 00111 10001
10000 10111 11101 00111 00001
1) ПОТОП
2) РОТОР
3) ТОПОР
4) ни одно из сообщений не принято корректно
Пояснение.
Длина обоих сообщений кратна пяти.
Анализируя первое сообщение «11011 10111 11101 00111 10001», приходим к выводу, что оно принято некорректно, поскольку нет такого слова, которое бы отличалось от слова «10001» только в одной позиции.
Рассмотрим второе сообщение. Учитывая, что каждая пятёрка отличается от некоторого кодового слова не более чем в одной позиции, его возможно расшифровать только как «ПОТОП».
№11. Для передачи данных по каналу связи используется 5-битовый код. Сообщение содержит только буквы А, Б и В, которые кодируются следующими кодовыми словами:
А — 11010, Б — 00110, В — 10101.
При передаче возможны помехи. Однако некоторые ошибки можно попытаться исправить. Любые два из этих трёх кодовых слов отличаются друг от друга не менее чем в трёх позициях. Поэтому если при передаче слова произошла ошибка не более чем в одной позиции, то можно сделать обоснованное предположение о том, какая буква передавалась. (Говорят, что «код исправляет одну ошибку».) Например, если получено кодовое слово 10110, считается, что передавалась буква Б. (Отличие от кодового слова для Б только в одной позиции, для остальных кодовых слов отличий больше.) Если принятое кодовое слово отличается от кодовых слов для букв А, Б, В более чем в одной позиции, то считается, что произошла ошибка (она обозначается ‘х’).
Получено сообщение 00111 11110 11000 10111. Декодируйте это сообщение — выберите правильный вариант.
1) БААх
2) БААВ
3) хААх
4) хххх
Пояснение.
Декодируем каждое слово сообщения. Первое слово: 00111 отличается от буквы Б только одной позицией. Второе слово: 11110 отличается от буквы А только одной позицией. Третье слово: 11000 отличается от буквы А только одной позицией. Четвёртое слово: 10111 отличается от буквы В только одной позицией.
Таким образом, ответ: БААВ.
Передача информации и выбор кода
№1. Для передачи по каналу связи сообщения, состоящего только из букв А, Б, В, Г, решили использовать неравномерный по длине код: A=1, Б=01, В=001. Как нужно закодировать букву Г, чтобы длина кода была минимальной и допускалось однозначное разбиение кодированного сообщения на буквы?
1) 0001
2) 000
3) 11
4) 101
Пояснение.
Для того, чтобы сообщение, записанное с помощью неравномерного по длине кода, однозначно раскодировалось, требуется, чтобы никакой код не был началом другого (более длинного) кода.
Рассмотрим варианты для буквы Г, начиная с самого короткого.
3) Г=11: код буквы A является началом этого кода, поэтому этот вариант не подходит.
4) Код Г=101 не подходит по аналогичной причине.
2) Код Г=000 не сопадает с началом ни одного кода,следовательно это и есть правильный ответ.
Правильный ответ указан под номером 2.
№2. Для передачи по каналу связи сообщения, состоящего только из букв А, Б, В, Г, решили использовать неравномерный по длине код: A=0, Б=100, В=101. Как нужно закодировать букву Г, чтобы длина кода была минимальной и допускалось однозначное разбиение кодированного сообщения на буквы?
1) 1
2) 11
3) 01
4) 010
Пояснение.
Для того, чтобы сообщение, записанное с помощью неравномерного по длине кода, однозначно раскодировалось, требуется, чтобы никакой код не был началом другого (более длинного) кода.
Рассмотрим варианты для буквы Г, начиная с самого короткого.
1) Г=1: код буквы Г является началом кода буквы В=101 и Б=100, поэтому этот вариант не подходит.
2) Код Г=11 не сопадает с началом ни одного кода,следовательно это и есть правильный ответ.
В вариантах 3) и 4) код буквы А=0 является началом кода буквы Г, поэтому они не подходят.
№3. Для кодирования некоторой последовательности, состоящей из букв А, Б, В, Г и Д, используется неравномерный двоичный код, позволяющий однозначно декодировать полученную двоичную последовательность. Вот этот код: А–10, Б–001, В–0001, Г–110, Д–111.
Можно ли сократить для одной из букв длину кодового слова так, чтобы код по-прежнему можно было декодировать однозначно? Коды остальных букв меняться не должны. Выберите правильный вариант ответа.
1) это невозможно
2) для буквы В – 000
3) для буквы Б – 0
4) для буквы Г – 11
Пояснение.
Мы видим, что выполняется условие Фано: никакое кодовое слово не является началом другого кодового слова, поэтому однозначно можем раскодировать сообщение с начала.
Чтобы сократить код одной буквы, необходимо выполнение условия Фано в новом коде.
Вариант 3 не подходит, потому что 0 является началом кода 0001.
Вариант 4 не подходит, потому что код 1 является началом кода 111.
Вариант 2 подходит, так как не нарушает условия Фано.
Правильный ответ указан под номером 2.
№4. Для кодирования некоторой последовательности, состоящей из букв А, Б, В, Г и Д, используется неравномерный двоичный код, позволяющий однозначно декодировать полученную двоичную последовательность. Вот этот код: А–011, Б–000, В–11, Г–001, Д–10. Можно ли сократить для одной из букв длину кодового слова так, чтобы код по-прежнему можно было декодировать однозначно? Коды остальных букв меняться не должны. Выберите правильный вариант ответа.
1) это невозможно
2) для буквы А – 01
3) для буквы Б – 00
4) для буквы Г – 00
Пояснение.
Мы видим, что выполняется условие Фано: никакое кодовое слово не является началом другого кодового слова, поэтому однозначно можем раскодировать сообщение с начала.
Чтобы сократить код одной буквы, необходимо выполнение условия Фано в новом коде.
Вариант 3 не подходит, потому что 00 является началом кода 001.
Вариант 4 не подходит, потому что код 00 является началом кода 000.
Вариант 2 подходит, так как не нарушает условия Фано.
Правильный ответ указан под номером 2.
№5. Для кодирования некоторой последовательности, состоящей из букв А, Б, В, Г и Д, используется неравномерный двоичный код, позволяющий однозначно декодировать полученную двоичную последовательность. Вот этот код: А – 00, Б – 01, В – 100, Г – 101, Д – 110. Можно ли сократить для одной из букв длину кодового слова так, чтобы код по-прежнему можно было декодировать однозначно? Коды остальных букв меняться не должны. Выберите правильный вариант ответа.
1) для буквы Д – 11
2) это невозможно
3) для буквы Г – 10
4) для буквы Д – 10
Пояснение.
Мы видим, что выполняется условие Фано: никакое кодовое слово не является началом другого кодового слова, поэтому однозначно можем раскодировать сообщение с начала.
Чтобы сократить код одной буквы, необходимо выполнение условия Фано в новом коде.
Вариант 3 не подходит, потому что 10 является началом кода 100.
Вариант 4 не подходит, потому что код 10 является началом кода 100 и 101.
Вариант 1 подходит, так как не нарушает условия Фано.
Правильный ответ указан под номером 1.
№6. Для кодирования некоторой последовательности, состоящей из букв А, Б, В, Г и Д, решили использовать неравномерный двоичный код, позволяющий однозначно декодировать двоичную последовательность, появляющуюся на приёмной стороне канала связи. Для букв А, Б, В и Г использовали такие кодовые слова: А–111, Б–110, В–100, Г–101.
Укажите, каким кодовым словом может быть закодирована буква Д. Код должен удовлетворять свойству однозначного декодирования. Если можно использовать более одного кодового слова, укажите кратчайшее из них.
1) 0
2) 01
3) 00
4) 000
Пояснение.
Мы видим, что выполняется условие Фано: никакое кодовое слово не является началом другого кодового слова, поэтому однозначно можем раскодировать сообщение с начала.
Чтобы закодировать Д, необходимо выполнение условия Фано в новом коде.
Каждый из этих вариантов может быть новым словом, т. к. не является началом ни одного из кодовых слов. Поэтому выбираем самое короткое — 0.
Правильный ответ указан под номером 1.
№7. Для кодирования некоторой последовательности, состоящей из букв А, Б, В, Г и Д, решили использовать неравномерный двоичный код, позволяющий однозначно декодировать двоичную последовательность, появляющуюся на приёмной стороне канала связи. Для букв А, Б, В и Г использовали такие кодовые слова: А — 100, Б — 101, В — 111, Г — 110.
Укажите, каким кодовым словом из перечисленных ниже может быть закодирована буква Д. Код должен удовлетворять свойству однозначного декодирования. Если можно использовать более одного кодового слова, укажите кратчайшее из них.
1) 000
2) 10
3) 11
4) 1111
Пояснение.
Для того, чтобы сообщение, записанное с помощью неравномерного по длине кода, однозначно раскодировалось, требуется, чтобы никакой код не был началом другого (более длинного) кода.
Рассмотрим варианты для буквы Д, начиная с самого короткого.
1) Д=10: код буквы Д является началом кода буквы Б=101, поэтому этот вариант не подходит.
2) Д=11: код буквы Д является началом кода буквы В=111, Д=110, поэтому этот вариант не подходит.
3) Д=000: код буквы Д не является началом другого кода, следовательно, это правильный ответ.
4) Д=1111: код буквы Д является началом кода буквы В=111, поэтому этот вариант не подходит.
Правильный ответ указан под номером 1.
№8. Для кодирования некоторой последовательности, состоящей из букв А, Б, В, Г и Д, решили использовать неравномерный двоичный код, позволяющий однозначно декодировать двоичную последовательность, появляющуюся на приёмной стороне канала связи. Для букв А, Б, В и Г использовали такие кодовые слова: А — 001, Б — 010, В— 000, Г — 011.
Укажите, каким кодовым словом из перечисленных ниже может быть закодирована буква Д.
Код должен удовлетворять свойству однозначного декодирования. Если можно использовать более одного кодового слова, укажите кратчайшее из них.
1) 00
2) 01
3) 101
4) 0000
Пояснение.
Для того, чтобы сообщение, записанное с помощью неравномерного по длине кода, однозначно раскодировалось, требуется, чтобы никакой код не был началом другого (более длинного) кода.
Рассмотрим варианты для буквы Д, начиная с самого короткого.
1) Д=00: код буквы Д является началом кода буквы В=000, поэтому этот вариант не подходит.
2) Д=01: код буквы Д является началом кода буквы Б=010, Г=011, поэтому этот вариант не подходит.
3) Д=101: код буквы Д не является началом другого кода, следовательно, это правильный ответ.
Правильный ответ указан под номером 3.
№9. Для кодирования некоторой последовательности, состоящей из букв А, Б, В, Г и Д, решили использовать неравномерный двоичный код, позволяющий однозначно декодировать двоичную последовательность, появляющуюся на приёмной стороне канала связи. Для букв А, Б, В и Г использовали такие кодовые слова: А — 111, Б — 110, В — 101, Г — 100.
Укажите, каким кодовым словом из перечисленных ниже может быть закодирована буква Д. Код должен удовлетворять свойству однозначного декодирования. Если можно использовать более одного кодового слова, укажите кратчайшее из них.
1) 1
2) 0
3) 01
4) 10
Пояснение.
Для того, чтобы сообщение, записанное с помощью неравномерного по длине кода, однозначно раскодировалось, требуется, чтобы никакой код не был началом другого (более длинного) кода. Рассмотрим варианты для буквы Д, начиная с самого короткого.
1) Д=1: код буквы Д является началом всех представленных кодов букв, поэтому этот вариант не подходит.
2) Д=0: код буквы Д не является началом другого кода, поэтому этот вариант подходит.
3) Д=01: код буквы Д не является началом другого кода, поэтому этот вариант подходит.
4) Д=10: код буквы Д является началом кодов букв В и Г, следовательно, этот вариант не подходит.
Таким образом, подходят два варианта: 0 и 01. 0 короче, чем 01.
Правильный ответ указан под номером 2.
№10. По каналу связи передаются сообщения, содержащие только 4 буквы: E, H, O, T. Для кодирования букв E, H, O используются 5-битовые кодовые слова: E — 00000, H — 00111, O — 11011.
Для этого набора кодовых слов выполнено такое свойство: любые два слова из набора отличаются не менее чем в трех позициях.
Это свойство важно для расшифровки сообщений при наличии помех. Какое из перечисленных ниже кодовых слов можно использовать для буквы T, чтобы указанное свойство выполнялось для всех четырёх кодовых слов?
1) 11111
2) 11100
3) 00011
4) не подходт ни одно из указанных выше слов
Пояснение.
Пользуясь правилом «любые два слова из набора отличаются не менее чем в трех позициях» проверим все возможные варианты.
Число 11111 отличается от кодового слова 00111 только в двух позициях.
Число 11100 отличается от кодового слова 00000 — в трех позициях, от 00111 — в четырех позициях, 11011 — в трех позициях.
Правильный вариант ответа второй.
для кодирования букв о к г д р решили использовать двоичное представление чисел 0 1 2 3 и 4
Напишите программу на Python, которая ищет среди целых чисел, принадлежащих числовому отрезку [1024; 28921], числа, которые делятся на сумму всех свои … х цифр. Запишите в ответе сумму всех таких чисел.Например, в диапазоне [12; 20] есть следующие числа: 12,18,20. Поэтомудля этого диапазона ответом является 12+18+20=50.
На странице есть слайдер, который переключается с помощью кнопок «стрелки». Необходимо добавить функцию автоматического переключения между фотографиям … и с таймером 20секунд. Как — это реализовать? Код ниже. Язык: js
Решите задание на пайтон пожалуйста На вход приведённой ниже программе поступает строка, начинающаяся с символа «>», а затем содержащая 10 цифр 1, … 20 цифр 2 и 30 цифр 3, расположенных в произвольном порядке. Определите сумму числовых значений цифр строки, получившейся в результате выполнения программы. Так, например, если результат работы программы представлял бы собой строку, состоящую из 50 цифр 4, то верным ответом было бы число 200. НАЧАЛО ПОКА нашлось (>1) ИЛИ нашлось (>2) ИЛИ нашлось (>3) ЕСЛИ нашлось (>1) ТО заменить (>1, 22>) КОНЕЦ ЕСЛИ ЕСЛИ нашлось (>2) ТО заменить (>2, 2>) КОНЕЦ ЕСЛИ ЕСЛИ нашлось (>3) ТО заменить (>3, 1>) КОНЕЦ ЕСЛИ КОНЕЦ ПОКА КОНЕЦ
Не могу написать проверку на високосный/не високосный год для февраля. Пыталась вводить и без проверки, но даже так февраль не выводится. Вот условие: … Напишите программу, которая запрашивает день, месяц, год и осуществляет проверку на корректный ввод данных (даты). Необходимо учитывать количество дней согласно месяцу, високосный/не високосный год. Значение года – четырехзначное положительное число. При вводе некорректных данных – сообщение. Если же дата введена верно, вывести на экран с названием месяца. Например, 9 июля 2021 г. int day, month, year; cout << «Введите день, месяц и год: «; cin >> day >> month >> year; if (year > 0) { if (month <= 12 && month >= 1) { if (day <= 31) { if (day >= 1 || day == 31) switch (month) { case 1: cout << day << » января » << year; break; case 3: cout << day << » марта » << year; break; case 5: cout << day << » мая » << year; break; case 7: cout << day << » июля » << year; break; case 8: cout << day << » августа » << year; break; case 10: cout << day << » октября » << year; break; case 12: cout << day << » декабря » << year; break; default: cout << «Неверный день.»; } else if (day >= 1 || day == 30) switch (month) { case 4: cout << day << » апреля » << year; break; case 6: cout << day << » июня » << year; break; case 9: cout << day << » сентября » << year; break; case 11: cout << day << » ноября » << year; break; default: cout << «Неверный день.»; } else if (day >= 1 || day == 29 && year %4 ==0 && year%100 !=0) switch (month) { case 2: cout << day << » февраля » << year; break; default: cout << «Неверный день.»; } } else cout << «Неверный день.»; } else cout << «Неверный месяц.»; } else cout << «Неверный год.»;
!МАКСИМУМ БАЛЛОВ! Выделите основную информацию, которую бы Вы вынесли на главную страницу сайта «Компьютерные курсы для школьников». Зарисуйте структу … ру главной страницы подобного сайта буду крайне благодарна
№9. Напишите программу, которая вводит два целых числа и находит их произведение, не используя операцию умножения. Учтите, что числа могут быть отрица … тельными. Входные данные Входная строка содержит два целых числа. Выходные данные Программа должна вывести произведение введённых чисел
Помогите решить задание на пайтон Укажите через запятую в порядке возрастания все десятичные числа, не превосходящие 26, запись которых в троичной сис … теме счисления оканчивается на 22?
задание с предикатом ,,,,,,,
Помогите решить это задание на Python, пожалуйста Значение выражения 3435 + 73 − 1 − X записали в системе счисления с основанием 7, при этом в записи … оказалось 12 цифр 6. При каком минимальном целом положительном X это возможно?
люди, кто разбирается в HTML-разметке и KompoZer, помогите, пожалуйста [прикрепляю номер на картинке, чтобы было удобнее]
Решение задач
Разбор решения задач по теме «Информация. Кодирование информации»
A1 вариант 1
Автоматическое устройство осуществило перекодировку информационного сообщения на русском языке, первоначально записанного в 16-битном коде Unicode, в 8-битную кодировку КОИ-8. При этом информационное сообщение уменьшилось на 720 бит. Какова длина сообщения в символах?
1) 90
2) 45
3) 180
4) 720
Решение:
При переходе от 16 битной к 8 битной кодировке, размер сообщения в битах уменьшится вдвое. Раз оно уменьшилось на 720 бит, то длина сообщения в символах кодировки КОИ-8 составила 720 символов.
Ответ: 4.
A1 вариант2
В кодировке Unicode на каждый символ отводится два байта. Определите информационный объем слова из двадцати четырех символов в этой кодировке.
1) 384 бита;
2) 192 бита;
3) 256 бит;
4) 48 бит.
Решение:
24 * 2байта=48 байтов=384 бита
Ответ: №1
A1 вариант 3
Считая, что каждый символ кодируется 16 битами, оцените информационный объем следующей Пушкинской фразы в кодировке Unicode:
Привычка свыше нам дана: Замена счастию она.
1) 44 бита;
2) 704 бита;
3) 44 байта;
4) 704 байта.
Решение
Данное предложение содержит 44 символа (включая точку и двоеточие), то есть в кодировке Unicode оно содержит 88 байт или 704 бита.
Ответ: № 2
A11(A13)
Для кодирования букв А, Б, В, Г решили использовать двухразрядные последовательные двоичные числа (от 00 до 11 соответственно). Если таким способом закодировать последовательность символов ВАГБ и записать результат шестнадцатеричным кодом, то получится:
1) 8D
2) CADB
3) 813
4) 2031.
Решение:
Пользуясь кодовой таблицей,
Запишем ВАГБ=100011012=8D16
Ответ:
1) 8D.
В7
Скорость передачи данных через ADSL-соединение равна 128000 бит/c. Через данное соединение передают файл размером 625 Кбайт. Определите время передачи файла в секундах.
Решение: 1) Переводим размер файла в биты: 625 килобайт * 1024 * 8 = 5120000 бит.
2) Определяем время передачи файла 51200000 / 128000 = 40 секунд
Ответ – 40.
Кодирование и декодирование информации. ЕГЭ — Информатика и ИКТ
Задание:
1) Для кодирования букв А, Б, В, Г решили использовать двухразрядные последовательные двоичные числа (от 00 до 11 соответственно). Если таким способом закодировать последовательность символов ГБАВ и записать результат в шестнадцатеричной системе счисления, то получится:
1) 13216 2) D216 3) 310216 4) 2D16
Решение и ответ:
Из условия соответственно:
А — 00
Б — 01
В — 10
Г — 11
ГБАВ = 11010010 — переведем данную двоичную запись в шестнадцатеричную систему и получим D2
Ответ: 2
2) Для кодирования букв А, Б, В, Г решили использовать двухразрядные последовательные двоичные числа (от 00 до 11 соответственно). Если таким способом закодировать последовательность символов ГБВА и записать результат шестнадцатеричным кодом, то получится:
1) 13816 2) DBCA16 3) D816 4) 312016
Решение и ответ:
По условию:
А = 00
Б = 01
В = 10
Г = 11
Значит:
ГБВА = 11011000 в двоичной системе. Переведем в шестнадцатеричную и получим D8
Ответ: 3
3) Для 5 букв латинского алфавита заданы их двоичные коды (для некоторых букв — из двух бит, для некоторых — из трех). Эти коды представлены в таблице:
a b c d e
000 110 01 001 10
Определите, какой набор букв закодирован двоичной строкой 1100000100110
1) baade 2) badde 3) bacde 4) bacdb
Решение и ответ:
Первая буква — b, так как стоит двоичный код 110
Вторая буква — a, так как стоит двоичный код 000
Третья буква — с, так как стоит двоичный код 01
Четвертая буква — d, так как стоит двоичный код 001
Пятая буква — e, так как стоит двоичный код 10
Итог: bacde, что соответствует варианту под номером 3.
Ответ: 3
4) Для кодирования букв А, Б, В, Г используются четырехразрядные последовательные двоичные числа от 1000 до 1011 соответственно. Если таким способом закодировать последовательность символов БГАВ и записать результат в восьмеричном коде, то получится:
1) 175423 2) 115612 3) 62577 4) 12376
Решение и ответ:
По условию:
А = 1000
Б = 1001
В = 1010
Г = 1011
БГАВ = 1001101110001010, теперь слудует перевести данное число из двоичной в восьмеричную, и получить ответ.
10011011100010102 = 1156128
Ответ: 2
5)
Для кодирования букв А, В, С, D используются трехразрядные последовательные двоичные числа, начинающиеся с 1 (от 100 до 111 соответственно). Если таким способом закодировать последовательность символов CDAB и записать результат в шестнадцатеричном коде, то получится:
1) А5216 2) 4С816 3) 15D16 4) DE516
Решение и ответ:
По условию: Соответственно
A = 100
B = 101
C = 110
D = 111
СDAB = 110111100101, переведем двоичное число в шестнадцатеричную:
1101111001012 = DE516
Ответ: 4
6) Для кодирования букв К, L, М, N используются четырехразрядные последовательные двоичные числа от 1000 до 1011 соответственно. Если таким способом закодировать последовательность символов KMLN и записать результат в восьмеричном коде, то получится:
1) 846138 2) 1052338 3) 123458 4) 7763258
Решение и ответ:
По условию: соответственно
K = 1000
L = 1001
M = 1010
N = 1011
KMLN = 1000101010011011, переведем в восьмеричное число:
10001010100110112 = 1052338
Ответ: 2
7) Для 5 букв латинского алфавита заданы их двоичные коды (для некоторых букв – из двух бит, для некоторых – из трех). Эти коды представлены в таблице:
а b с d е
100 110 011 01 10
Определите, какой набор букв закодирован двоичной строкой 1000110110110, если известно, что все буквы в последовательности – разные:
1) cbade 2) acdeb 3) acbed 4) bacde
Решение и ответ:
Запишем двоичный код в виде битов: Методом перебора возможных вариантов, чтобы не повторялись буквы.
Получается: 100 011 01 10 110
Следовательно: acdeb
Ответ: 2
8) Для 6 букв латинского алфавита заданы их двоичные коды (для некоторых букв из двух бит, для некоторых – из трех). Эти коды представлены в таблице:
А В С D Е F
00 100 10 011 11 101
Определите, какая последовательность из 6 букв закодирована двоичной строкой 011111000101100.
1) DEFBAC 2) ABDEFC 3) DECAFB 4) EFCABD
Решение и ответ:
Решим методом перебора, так как буквы в ответах не повторяются, значит и коды не должны повторяться:
Получаем:
011 11 10 00 101 100
Соответственно: DECAFB
Ответ: 3
9) Для кодирования букв А, В, С, D используются четырехразрядные последовательные двоичные числа, начинающиеся с 1 (от 1001 до 1100 соответственно). Если таким способом закодировать последовательность символов CADB и записать результат в шестнадцатеричном коде, то получится:
1) AF5216 2) 4CB816 3) F15D16 4) В9СА16
Решение и ответ: соответственно..
A — 1001
B — 1010
C — 1011
D — 1100
Значит: CADB = 1011100111001010, переведем 1011100111001010 из двоичной в шестнадцатеричную:
1011 1001 1100 10102= B9CA16, что соответствует четвертому варианту.
Ответ: 4
10) Для кодирования сообщения, состоящего только из букв А, Б, В и Г, используется неравномерный по длине двоичный код:
А Б В Г
00 11 010 011
Если таким способом закодировать последовательность символов ВГАГБВ и записать результат в шестнадцатеричном коде, то получится:
1) CDADBC16 2) A7C416 3) 41271016 4) 4С7А16
Решение и ответ:
ВГАГБВ = 0100110001111010, переведем в шестнадцатеричную:
0100 1100 0111 10102 = 4C7A16
Ответ: 4
11) Для кодирования сообщения, состоящего только из букв А, Б, В и Г, используется неравномерный по длине двоичный код:
А Б В Г
00 11 010 011
Если таким способом закодировать последовательность символов ГАВБВГ и записать результат в шестнадцатеричном коде, то получится:
1) 62D316 2) 3D2616 3) 3132616 4) 6213316
Решение и ответ:
ГАВБВГ = 01100010110100112 — Переведем в шестнадцатеричную систему:
0110 0010 1101 00112 = 62D316
Ответ: 1
12) Для кодирования сообщения, состоящего только из букв А, Б, В и Г, используется неравномерный по длине
двоичный код:
А Б В Г
00 11 010 011
Если таким способом закодировать последовательность символов ГБВАВГ и записать результат в шестнадцатеричном
коде, то получится:
1) 7101316 2) DBCACD16 3) 31A716 4) 7A1316
Решение и ответ:
ГБВАВГ = 01111010000100112 — переведем в шестнадцатеричную.
0111 1010 0001 00112 = 7A1316
Ответ: 4
13) Для кодирования сообщения, состоящего только из букв А, Б, В и Г, используется неравномерный по длине двоичный код:
А Б В Г
00 11 010 011
Если таким способом закодировать последовательность символов ГАВБГВ и записать результат в шестнадцатеричном коде, то получится:
1) DACBDC16 2) AD2616 3) 62131016 4) 62DA16
Решение и ответ: соответственно..
ГАВБГВ = 01100010110110102, переведем в шестнадцатеричную:
0110 0010 1101 10102 = 62DA16
Ответ: 4
14) Для кодирования сообщения, состоящего только из букв A, B, C, D и E, используется неравномерный по длине двоичный код:
A B C D E
000 11 01 001 10
Какое (только одно!) из четырех полученных сообщений было передано без ошибок и может быть раскодировано:
1) 110000010011110
2) 110000011011110
3) 110001001001110
4) 110000001011110
Решение и ответ:
Возьмем первый код:
11 000 001 001 11 10 = BADDBE
Второй код:
11 000 001 10 11 110 = с ошибкой в конце.
Третий код:
11 000 10 01 001 110 = с ошибкой в конце.
Четвертый код:
11 000 000 10 11 110 = с ошибкой в конце.
Ответ: 1
15) Для передачи по каналу связи сообщения, состоящего только из символов А, Б, В и Г используется посимвольное
кодирование: А-00, Б-11, В-010, Г-011. Через канал связи передается сообщение: ВАГБГВ. Закодируйте сообщение
данным кодом. Полученную двоичную последовательность переведите в шестнадцатеричный вид.
1) AD34 2) 43DA 3) 101334 4) CADBCD
Решение и ответ:
ВАГБГВ = 01000011110110102, переведем в шестнадцатеричную систему:
0100 0011 1101 10102 = 43DA16
Ответ: 2
16) Для передачи по каналу связи сообщения, состоящего только из букв А, Б, В, Г, решили использовать неравномерный по длине код: A=1, Б=01, В=001. Как нужно закодировать букву Г, чтобы длина кода была минимальной и допускалось однозначное разбиение кодированного сообщения на буквы?
1) 0001 2) 000 3) 11 4) 101
Решение и ответ:
Для того, чтобы сообщение раскодировалось, требуется, чтобы ни один код не был началом другого — более длинного кода.
1, 3 и 4 варианты не подходят, являются началом других кодов.
2 вариант — не является началом других кодов.
Ответ: 2
17) Для передачи по каналу связи сообщения, состоящего только из букв А, Б, В, Г, решили использовать неравномерный по длине код: A=0, Б=100, В=101. Как нужно закодировать букву Г, чтобы длина кода была минимальной и допускалось однозначное разбиение кодированного сообщения на буквы?
1) 1 2) 11 3) 01 4) 010
Аналогично заданию номер 16.
Ответ: 2
18) Черно-белое растровое изображение кодируется построчно, начиная с левого верхнего угла и заканчивая в правом нижнем углу. При кодировании 1 обозначает черный цвет, а 0 – белый.
Для компактности результат записали в восьмеричной системе счисления. Выберите правильную запись кода.
1) 57414 2) 53414 3) 53412 4) 53012
Решение и ответ:
После кодирования мы получаем данный код:
1010111000010102, переведем данный код в восьмеричную:
101 011 100 001 0102 = 534128
Ответ: 3
19) Для передачи по каналу связи сообщения, состоящего только из символов А, Б, В и Г используется посимвольное
кодирование: А-0, Б-11, В-100, Г-011. Через канал связи передается сообщение: ГБАВАВГ. Закодируйте сообщение
данным кодом. Полученную двоичную последовательность переведите в восьмеричный код.
1) DBACACD 2) 75043 3) 7A23 4) 3304043
Решение и ответ: Соответственно:
ГБАВАВГ = 01111010001000112, переведем в восьмеричную систему.
0 111 101 000 100 0112 = 750438, первый нолик не значащий.
Ответ: 2
20) Для передачи данных по каналу связи используется 5-битовый код. Сообщение содержит только
буквы А, Б и В, которые кодируются следующими кодовыми словами:
A — 11010, Б — 00110, В — 10101.
При передаче возможны помехи. Однако некоторые ошибки можно попытаться исправить. Любые два из этих трёх кодовых слов отличаются друг от друга не менее чем в трёх позициях. Поэтому если при передаче слова произошла ошибка не более чем в одной позиции, то можно сделать обоснованное предположение о том, какая буква передавалась. (Говорят, что «код исправляет одну ошибку».) Например, если получено кодовое слово 10110, считается, что передавалась буква Б. (Отличие от кодового слова для Б — только в одной позиции, для остальных кодовых слов отличий больше.) Если принятое кодовое слово отличается от кодовых слов для букв А, Б, В более чем в одной позиции, то считается, что произошла ошибка(она обозначается‘x’).
Получено сообщение 00111 11110 11000 10111. Декодируйте это сообщение — выберите правильный вариант.
1) БААx
2) БААВ
3) xxxx
4) xAAx
Решение:
1) 00111 = Б, так как 1 ошибка в последней цифре.
2) 11110 = A, так как 1 ошибка в третьей цифре.
3) 11000 = А, так как 1 ошибка в четвертой цифре.
4) 10111 = В, так как 1 ошибка в четвертой цифре
00111 11110 11000 10111 = БААВ.
Ответ: 2
11. Какие коды используются в вычислительной технике для кодирования букв русского алфавита?
Windows-1251 — набор символов и кодировка, являющаяся стандартной 8-битной кодировкой для всех русских версий Microsoft Windows.
UTF-8 – распространённая кодировка символов Юникода, совместимая с 8-битными форматами передачи текста. Нашла широкое применение в операционных системах и веб-пространстве.
КОИ-8 – восьмибитовая ASCII-совместимая кодовая страница, разработанная для кодирования букв кириллических алфавитов.
ISO 8859-5 – 8-битная кодовая страница из семейства кодовых страниц стандарта ISO-8859 для представления кириллицы.
14. Как кодируется графическая информация, если изображение черно-белое? цветное?
В процессе кодирования изображения производится его пространственная дискретизация. Пространственную дискретизацию изображения можно сравнить с построением изображения из мозаики. Изображение разбивается на отдельные маленькие фрагменты (точки), причем каждому фрагменту присваивается значение его цвета, то есть код цвета (красный, зеленый, синий и так далее). Для черно-белого изображения информационный объем одной точки равен одному биту (либо черная, либо белая – либо 1, либо 0).
Контрольные вопросы (развернутые ответы)
4. Основные результаты теории кодирования.
Кодирование преследует несколько целей. Первая из них заключается в том, чтобы представить сообщения в такой системе символов, которая обеспечивала бы простоту и надежность аппаратной реализации информационных устройств и их необходимую эффективность. Вторая цель кодирования состоит в том, чтобы обеспечить наилучшее согласование свойств источника сообщений со свойствами канала связи. Путем такого согласования добиваются выигрыша во времени передачи, то есть повышения эффективности системы. Наконец, при наличии помех кодирование может обеспечить достаточно высокую достоверность передачи или обработки информации. В процессе хранения данных и передачи информации по сетям связи неизбежно возникают ошибки. Так в простых (примитивных) кодах ошибка в приеме хотя бы одного элемента кодовой комбинации приводит к неправильной регистрации передаваемого сообщения. Корректирующие коды позволяют обнаруживать и устранять ошибки в кодовых комбинациях. Кодирование, обеспечивающее изменение структуры сигналов, ни в какой мере не должно изменять количество информации, заключенном в первоначальном сообщении.
8. Основные теоремы теории кодирования и их следствия.
Коды Хэмминга – наиболее известные и, вероятно, первые из самоконтролирующихся и самокорректирующихся кодов. Построены они применительно к двоичной системе счисления. Коды Хэмминга являются самоконтролирующимися кодами, то есть кодами, позволяющими автоматически обнаруживать ошибки при передаче данных. Для их построения достаточно приписать к каждому слову один добавочный (контрольный) двоичный разряд и выбрать цифру этого разряда так, чтобы общее количество единиц в изображении любого числа было, например, четным. Одиночная ошибка в каком-либо разряде передаваемого слова (в том числе, может быть, и в контрольном разряде) изменит четность общего количества единиц. Счетчики по модулю 2, подсчитывающие количество единиц, которые содержатся среди двоичных цифр числа, могут давать сигнал о наличии ошибок. При этом невозможно узнать, в каком именно разряде произошла ошибка, и, следовательно, нет возможности исправить её. Остаются незамеченными также ошибки, возникающие одновременно в двух, в четырёх или вообще в четном количестве разрядов. Впрочем, двойные, а тем более четырёхкратные ошибки полагаются маловероятными.
Коды Рида — Соломона – недвоичные циклические коды, позволяющие исправлять ошибки в блоках данных. Элементами кодового вектора являются не биты, а группы битов (блоки). Очень распространены коды Рида — Соломона, работающие с байтами (октетами). Коды Рида — Соломона являются важным частным случаем БЧХ-кода.
Коды Боуза — Чоудхури — Хоквингхема (БЧХ-коды) – в теории кодирования это широкий класс циклических кодов, применяемых для защиты информации от ошибо. Отличается возможностью построения кода с заранее определёнными корректирующими свойствами, а именно, минимальным кодовым расстоянием.
Теорема Шеннона об источнике шифрования (или теорема бесшумного шифрования) устанавливает предел максимального сжатия данных и числовое значение энтропии (мера неопределённости или непредсказуемости информации) Шеннона. Теорема Шеннона об источнике шифрования показывает, что (когда в потоке независимо и одинаково распределенных случайных переменных данные стремятся к бесконечности) невозможно сжать данные настолько, что оценка кода (среднее число бит на символ) меньше чем энтропия Шеннона исходных данных, без потери точности информации. Тем не менее можно получить код, близкий к энтропии Шеннона без значительных потерь.
Урок 14. кодирование текстовой информации — Информатика — 10 класс
Информатика, 10 класс. Урок № 14.
Тема — Кодирование текстовой информации
Цели и задачи урока:
— познакомиться со способами кодирования и декодирования текстовой информации с помощью кодовых таблиц и компьютера;
— познакомиться со способом определения информационного объема текстового сообщения;
— познакомиться с алгоритмом Хаффмана.
Вся информация в компьютере хранится в двоичном коде. Поэтому надо научиться преобразовывать символы в двоичный код.
Формула Хартли определяет количество информации в зависимости от количества возможных вариантов:
N=2i, где
N — это количество вариантов,
i — это количество бит, не обходимых для кодирования.
Если же мы преобразуем эту формулу и примем за N — количество символов в используемом алфавите (назовем это мощностью алфавита), то мы поймем, сколько памяти потребуется для кодирования одного символа.
N=2i, где N — кол-во возможных вариантов
i — кол-во бит, потребуемых для кодирования
Итак, если в нашем алфавите будет присутствовать только 32 символа, то каждый из них займет только 5 бит.
И тогда каждому символу мы дадим уникальный двоичный код. Такую таблицу мы будем назвать кодировочной.
Первая широко используемая кодировочная таблица была создана в США и называлась ASCII, что в переводе означало American standard code for information interchange. Как вы видите, в таблице присутствуют не только латинские буквы, но и цифры, и даже действия. Каждому символу отводится 7 бит, а значит, всего было закодировано 128 символов.
Но так как этого количества было недостаточно, стали создаваться другие таблицы, в которых можно было закодировать и другие символы. Например, таблица Windows-1251, которая, по сути, являлась изменением таблицы ASCII, в которую добавили буквы кириллицы. Таких таблиц было создано множество: MS-DOS, КОИ-8, ISO, Mac и другие:
Проблема использования таких различных таблиц приводила к тому, что текст, написанный на одном компьютере, мог некорректно читаться на другом. Например:
Поэтому была разработана международная таблица кодировки Unicode, включающая в себя как символы английского, русского, немецкого, арабского и других языков. На каждый символ в такой таблице отводится 16 бит, то есть она позволяет кодировать 65536 символов. Однако использование такой таблицы сильно «утяжеляет» текст. Поэтому существуют различные алгоритмы неравномерной кодировки текста, например, алгоритм Хаффмана.
АЛГОРИТМ ХАФФМАНА
Идея алгоритма Хаффмана основана на частоте появления символа в последовательности. Символ, который встречается в последовательности чаще всего, получает новый очень маленький код, а символ, который встречается реже всего, получает, наоборот, очень длинный код.
Пусть нам дано сообщение aaabcbeeffaabfffedbac.
Чтобы узнать наиболее выгодный префиксный код для такого сообщения, надо узнать частоту появления каждого символа в сообщении.
Шаг 1.
Подсчитайте и внесите в таблицу частоту появления каждого символа в сообщении:
У вас должно получиться:
Шаг 2.
Расположите буквы в порядке возрастания их частоты.
Шаг 3.
Теперь возьмем два символа с наименьшей чистотой и представим их листьями в дереве, частота которого будет равна сумме частот этих листьев.
Символы d и c превращаются в ветку дерева:
Шаг 4.
Проделываем эти шаги до тех пор, пока не получится дерево, содержащее все символы.
Итак, сортируем таблицу:
Шаг 5.
Объединяем символ e и символ cd в ветку дерева:
d
C
Шаг 6.
Сортируем:
Шаг 7.
Шаг 8.
Сортируем:
Шаг 9.
Шаг 10.
Сортируем:
Шаг 11.
Шаг 12.
Получился префиксный код. Теперь осталось расставить 1 и 0. Пусть каждая правая ветвь обозначает 1, а левая — 0.
Шаг 13.
Составляем код буквы, идя по ветке дерева от буквы к основанию дерева.
Тогда код для каждой буквы будет:
Задание №1
Закодируйте ASCII кодом слово MOSCOW.
Решение:
Составим таблицу и поместим туда слово MOSCOW. Используя таблицу ASCII кодов, закодируем все буквы слова:
M | O | S | C | O | W |
1001101 | 1001111 | 1010011 | 1000011 | 1001111 | 1110111 |
ОТВЕТ: 100110110011111010011100001110011111110111
Задание №2
Используя табличный код Windows1251, закодируйте слово КОМПЬЮТЕР.
Решение:
К | О | М | П | Ь | Ю | Т | Е | Р |
234 | 206 | 204 | 239 | 252 | 254 | 242 | 197 | 208 |
Ответ: 234206204239252254242197208
Задание №3
Используя алгоритма Хаффмана, закодируйте сообщение: Россия
Решение:
Давайте все левые ветви обозначим «1», а правые – «0»
Таким образом: С — 0, Р — 101, О — 100, И — 111, Я — 110
ОТВЕТ: 10110000111110
Главная / Подготовка к ЕГЭ / Кодирование и декодирование информации |
||
А9 — Кодирование и декодирование информации |
||
|
||
|
||
Тренировочные упражнения: |
||
1. (КИМ 2014). Для передачи данных по каналу связи используется
5-битовый код. Сообщение содержит только буквы А, Б и В, которые кодируются следующими кодовыми словами: |
||
A – 11010, Б – 00110, В – 10101. |
||
При передаче возможны помехи. Однако некоторые ошибки можно попытаться исправить. Любые два из этих трёх кодовых слов отличаются друг от друга не менее чем в трёх позициях. Поэтому если при передаче слова произошла ошибка не более чем в одной позиции, то можно сделать обоснованное предположение о том, какая буква передавалась. (Говорят, что «код исправляет одну ошибку».) Например, если получено кодовое слово 10110, считается, что передавалась буква Б. (Отличие от кодового слова для Б – только в одной позиции, для остальных кодовых слов отличий больше.) Если принятое кодовое слово отличается от кодовых слов для букв А, Б, В более чем в одной позиции, то считается, что произошла ошибка (она обозначается ‘x’) |
||
Получено сообщение 00111 11110 11000 10111. Декодируйте это сообщение – выберите правильный вариант. |
||
2. Для кодирования букв А, Б, В, Г решили использовать двухразрядные последовательные двоичные числа (от 00 до 11 соответственно). Если таким способом закодировать последовательность символов ГБАВ и записать результат в шестнадцатеричной системе счисления, то получится: | ||
3. Для кодирования букв А, Б, В, Г решили использовать двухразрядные последовательные двоичные числа (от 00 до 11 соответственно). Если таким способом закодировать последовательность символов АВГАБ и записать результат в шестнадцатеричной системе счисления, то получится: | ||
| ||
|
Кодировок символов для начинающих
Во-первых, какое мне дело?
Если вы используете что-либо, кроме самого основного текста на английском языке, люди не смогут прочитать созданный вами контент. если вы не укажете, какую кодировку символов вы использовали.
Например, вы можете сделать так, чтобы текст выглядел так:
, но на самом деле он может отображаться так:
Отсутствие информации о кодировке символов не только ухудшает читаемость отображаемого текста, но также может означать, что ваши данные не могут быть найдены поисковой системой или надежно обрабатывается машинами другими способами.
Так что за кодировка символов?
Слова и предложения в тексте состоят из знаков . Примеры символов включают латинскую букву á, китайскую идеограмму 請 или символ деванагари ह.
Возможно, вы не сможете увидеть некоторые символы на этой странице, потому что у вас нет необходимых шрифтов. Если вы нажмете на то место, где вы ожидали увидеть персонажа, вы перейдете к графической версии. Эта страница закодирована в UTF-8.
Персонажи, необходимые для определенной цели, сгруппированы в набор символов (также называемый репертуаром ). (Чтобы однозначно обозначать символы, каждый символ связан с числом, называемым кодовой точкой .)
Символы хранятся в компьютере как один или несколько байтов .
В принципе, вы можете визуализировать это, предположив, что все символы хранятся в компьютерах с использованием специального кода, такого как шифры, используемые в шпионаже.Кодировка символов предоставляет ключ для разблокировки (т. Е. Взлома) кода. Это набор соответствий между байтами в компьютере и символами в наборе символов. Без ключа данные выглядят как мусор.
Вводящий в заблуждение термин кодировка часто используется для обозначения того, что в действительности является кодировкой символов. Вам следует помните об этом использовании, но всегда старайтесь использовать термины кодировки символов.
Итак, когда вы вводите текст с клавиатуры или каким-либо другим способом, кодировка символов сопоставляет выбранные вами символы с конкретными байтами в памяти компьютера, а затем для отображения текста считывает байты обратно в символы.
К сожалению, существует множество различных наборов символов и кодировок символов, т.е. много разных способов сопоставления байтов, кодовые точки и символы. В разделе «Дополнительная информация» для тех, кому интересно, чуть подробнее.
Однако в большинстве случаев вам не нужно знать подробности. Вам просто нужно быть уверенным, что вы прислушиваетесь к советам в раздел Как это влияет на меня? ниже.
Как в это вписываются шрифты?
Шрифт — это набор определений глифов, т.е.определения форм, используемых для отображения символов.
Как только ваш браузер или приложение определит, с какими символами имеет дело, оно будет искать в шрифте глифы, которые можно использовать для отображения. или распечатайте эти символы. (Конечно, если информация о кодировке была неправильной, она будет искать глифы для неправильных символов.)
Данный шрифт обычно покрывает один набор символов или, в случае большого набора символов, например Unicode, только подмножество всех персонажей в наборе.Если в вашем шрифте нет глифа для определенного символа, некоторые браузеры или программные приложения будут искать недостающие глифы в других шрифты в вашей системе (это будет означать, что глиф будет отличаться от окружающего текста, как записка с требованием выкупа). В противном случае вы обычно вместо этого вы увидите квадратную рамку, вопросительный знак или какой-либо другой символ. Например:
Как это повлияет на меня?
Как автор или разработчик контента, в настоящее время вы всегда должны выбирать UTF-8 кодировка символов для вашего контента или данных.Эта кодировка Unicode — хороший выбор, потому что вы можете использовать односимвольную кодировку для обработки любого символа, который вам может понадобиться. Это значительно упрощает работу. Использование Unicode во всей вашей системе также устраняет необходимость отслеживать и конвертировать между различными кодировками символов.
Авторы контента должны узнать, как объявить персонажа кодировка, используемая для формата документа, с которым они работают.
Обратите внимание, что просто объявление другой кодировки на вашей странице не изменит байты; вам также нужно сохранить текст в этой кодировке.
Как автор контента, вам необходимо проверить, в какой кодировке ваш редактор или скрипты сохраняют текст и как сохранять текст в UTF-8. (В наши дни это обычно используется по умолчанию.) Вам также может потребоваться проверить, что ваш сервер обслуживает документы с правильным HTTP декларации.
Разработчикам необходимо убедиться, что различные части системы могут взаимодействовать друг с другом, понимать, какие кодировки символов используются и поддерживают все необходимые кодировки и символы.(В идеале вы должны использовать UTF-8 повсюду и избавиться от этой проблемы.)
По ссылкам ниже можно найти дополнительную информацию по этим темам.
Этот раздел предоставляет небольшую дополнительную информацию о сопоставлении байтов, кодовых точек и символов для тех, кому это интересно. Не стесняйтесь просто перейти к разделу Дополнительная литература.
Обратите внимание, что номера кодовых точек обычно выражаются в шестнадцатеричной системе счисления, т.е. основание 16. Например, 233 в шестнадцатеричной форме — это E9.Значения кодовой точки Unicode обычно записываются в форме U + 00E9.
В наборе кодированных символов под названием ISO 8859-1 (также известном как Latin1) значение десятичной кодовой точки для буквы é равно 233. Однако в ISO 8859-5, та же кодовая точка представляет кириллический символ щ.
Эти наборы символов содержат менее 256 символов и напрямую сопоставляют кодовые точки с байтовыми значениями, поэтому кодовая точка со значением 233 представлена одним байтом со значением 233.Обратите внимание, что только контекст определяет, представляет ли этот байт либо é, либо щ.
Есть и другие способы работы с символами из ряда скриптов. Например, с набором символов Unicode вы можете представить оба символа в одном наборе. Фактически, Юникод содержит в одном наборе, вероятно, все символы, которые вам когда-либо понадобятся. Хотя буква é по-прежнему представлена значением кодовой точки 233, кириллический символ щ теперь имеет значение кодовой точки 1097.
С другой стороны, 1097 слишком большое число, чтобы его можно было представить одним байт*. Итак, если вы используете кодировку символов для текста Unicode под названием UTF-8, щ будет представлен двумя байтами. Тем не менее значение кодовой точки не просто выводится из значения двух байтов, соединенных вместе — требуется более сложное декодирование.
Другой Юникод символы отображаются в один, три или четыре байта в кодировке UTF-8.
Кроме того, обратите внимание, что буква é также представлена двумя байтами в UTF-8, а не одним байтом, используемым в ISO 8859-1. (Только символы ASCII кодируются одним байтом в UTF-8.)
UTF-8 — это наиболее широко используемый способ представления текста Unicode на веб-страницах, и вы всегда должны использовать UTF-8 при создании веб-страниц и баз данных. Но, в принципе, UTF-8 — лишь один из возможных способов кодирования. Символы Юникода. Другими словами, одна кодовая точка в наборе символов Unicode может фактически отображаться в разные последовательности байтов, в зависимости от какая кодировка использовалась для документа.Кодовые точки Unicode могут быть сопоставлены с байтами с использованием любой из кодировок, называемых UTF-8, UTF-16 или UTF-32. Символ деванагари क с кодовой точкой 2325 (что составляет 915 в шестнадцатеричной системе счисления) будет представлен двумя байтов при использовании кодировки UTF-16 (09 15), трех байтов с UTF-8 (E0 A4 95) или четырех байтов с UTF-32 (00 00 09 15).
Могут быть и другие сложности помимо описанных в этом разделе (например, порядок байтов и escape-последовательности), но детали описанное здесь показывает, почему важно, чтобы приложение, с которым вы работаете, знало, какая кодировка символов подходит для ваших данных, и знает, как обрабатывать эту кодировку.
CS101 — Кодировка текста
Мы рассмотрели, как представлять числа в двоичном формате; в этом разделе мы исследуем представление текста в виде битов. Под «текстом» мы подразумеваем алфавиты и другие системы письма, которые используются везде, от обновлений статуса и текстовых сообщений до электронной почты и электронных книг.
Для начала мы можем предложить способ сопоставления букв и других символов (знаков препинания, пробела и т. Д.) С числами. Например, пусть A будет представлен как число 1, B как 2, C как 3 и так далее.В английском алфавите 26 букв, поэтому нам понадобится всего 5 бит. (2⁵ равно 32, так что у нас даже осталось несколько цифр для знаков препинания.)
Упражнение: , используя схему, описанную выше, декодировать слово, представленное битами 00011 00001 10100
Если в наших текстовых сообщениях необходимо различать прописные и строчные буквы, нам понадобится более 5 бит. Верхний регистр A – Z составляет 26 символов, нижний регистр a – z — еще 26, так что всего 52.2⁶ равно 64, так что 6 бит будут охватывать его и снова иметь несколько доступных для пунктуации.
А как насчет включения в наш текст чисел ? Если мы хотим отправить текстовое сообщение «Amazon имеет 20% скидку на учебники», мы не сможем представить это «20» как 10100 в двоичном формате, потому что это будет противоречить представлению буквы «T».
Вместо этого нам нужно добавить место для стандартных десяти цифр в виде символов. Включая символы с прописными и строчными буквами, нам нужно как минимум 62 символа.Технически это умещается в 6 битах, но у нас будет очень мало места для знаков препинания и символа, представляющего пробел. Так что для практических целей мы используем до 7 бит на символ. 2⁷ равно 128, так что теперь есть много места для других символов.
Кроме того, может быть способ «повторно использовать» буквенные представления в качестве цифр. Нам просто нужно поставить перед ними маркер, означающий «это число», или потребовать, чтобы получатель угадал из контекста. Так обстоит дело с шрифтом Брайля, системой письма для слабовидящих, основанной на 6-битных символах.(Каждое из шести мест может быть поднято или нет.) Символ Брайля для «A» совпадает с числом «1».Простые кодировки, которые я предложил в предыдущем разделе, основаны на фиксированном числе бит на символ — будь то 5, 6 или 7. Один из способов проиллюстрировать это как дерево — см. Этот файл:
Деревья — это часто используемая структура данных в информатике, но они немного отличаются от органических деревьев, к которым они относятся. Прежде всего, мы обычно рисуем деревья с корнем вверху, а они растут вниз по странице.Каждый раз, когда круг разделяется на два пути, мы называем это ветвью . Дерево заканчивается в нижней части ряда из листьев.
Это конкретное дерево является двоичным деревом , значение означает, что каждый узел является либо листом, либо ветвью с ровно двумя дочерними элементами. Самое приятное в двоичном дереве то, что пути от корня к листу точно соответствуют двоичным числам. Просто представьте, что ноль — это слева, в дереве, а единица — как справа. Тогда номер 01101
(например) соответствует левому-правому-правому-левому-правому, который попадает на лист с отметкой N
. Расшифруйте сообщение в двоичном формате, написанном под деревом.
Вы можете сказать, что предыдущее дерево имеет фиксированную ширину, потому что каждый путь от корня к листу представляет собой ровно 5 переходов. Теперь сравните это с переменным битовым деревом в этом файле:
В этом случае разные буквы могут иметь очень разное количество представляющих их битов.Например, E
— кратчайший путь, представляющий всего 3 бита. X
— очень длинный путь, представляющий 10 бит. Расшифруйте слово, указанное в двоичном формате в правом верхнем углу страницы.
На раздаточном материале слово напечатано с пробелами между буквами, но на самом деле в них нет необходимости. Биты 11100001001
могут быть декодированы, хотя я не подчеркивал, где заканчивается один символ и начинается следующий. Вы просто идете по тропинке на дереве, пока не приземлитесь на лист.Затем начните снова сверху для следующего бита.
Это конкретное дерево переменной ширины создано так, что в целом оно сжимает английский текст на . Это работает, потому что наиболее часто используемые буквы представлены пропорционально укороченными битовыми строками. Например, давайте сравним кодировки с использованием обоих деревьев последовательности слов:
слово: фиксированная кодировка: переменная кодировка:
THE 100110011100100 15 бит 11100001001 11 бит
ТРАВА 001101000100000 11010000001100
1001010010 25 бит 01000100 22 бит
IS 0100010010 10 бит 01110100 8 бит
ЗЕЛЕНЫЙ 001101000100100 1101000000001
0010001101 25 бит 0010110 20 бит
САИД 100100000001000 010011000111
00011 20 бит 11011 17 бит
QUUX 100001010010100 1111100001
10111 20 бит 111111111111
1111100010 32 бита
всего: 115 бит 110 бит
При фиксированной кодировке каждый символ состоит ровно из 5 бит, поэтому вся последовательность слов составляет 115 бит.(В этом упражнении мы не учитываем кодирование пробелов между словами.)
Сравните это с кодировкой переменных. Почти каждое слово имеет более короткое представление. Единственное исключение — «QUUX», что, конечно, не совсем английское слово. Но он представляет собой случай слова с редко используемыми буквами, и кодирование этого слова существенно увеличилось в размере с 20 до 32 бит. В целом, второе дерево по-прежнему сжимается, если вы в основном используете английские слова с часто встречающимися буквами.
Это подводит нас к наиболее популярным и влиятельным кодам с фиксированным битом. Он называется ASCII (произносится как , «ключ-задница», ), что означает Американский стандартный код для обмена информацией. Он был разработан в начале 1960-х годов и включает 7-битное отображение букв верхнего и нижнего регистра, цифр, различных символов и «управляющих символов». Вы можете увидеть их все в таблице на http://www.asciitable.com/
.Управляющие символы находятся в диапазоне 0–31 (основание десять).У них нет визуального представления, но вместо этого они направляют устройство отображения определенным образом. Многие из них уже устарели, но, пожалуй, наиболее важным является 10₁₀ = A₁₆ = 0001010₂, символ «новой строки». Каждый раз, когда вы нажимаете клавишу ВВОД, чтобы перейти к следующей строке, этот символ вставляется в ваш документ.
Символ 32 — это пробел, а символы 33-63 содержат в основном знаки препинания. Цифры находятся в позициях с 48 по 57. Их легко распознать в двоичном формате: все они начинаются с 011, а затем младшие четыре бита соответствуют цифре.Таким образом, вы можете сразу сказать, что 0110101₂ = 35₁₆ — это цифра «5».
Диапазон 64–95 состоит в основном из прописных букв, а 96–127 — в основном из нижнего регистра. (Оба диапазона включают еще несколько знаков пунктуации и скобок.) Эти числа соответствуют битовым строкам, начинающимся с 10 для прописных букв и 11 для строчных. Остальные 5 бит определяют позицию буквы в алфавите. Таким образом, 10 01011₂ = 4B₁₆ — это одиннадцатая буква (заглавная «K»), а 11 01011₂ = 6B₁₆ — соответствующая строчная буква «k».
ASCII относительно хорошо работал в англоязычном мире, но у других народов и культур есть потребности в других символах, акцентах, алфавитах и других символах. Невозможно написать niño или cafe в кодировке ASCII, или польское имя Michał, , и это безнадежно для греческого слова ἀλήθεια, или китайского 福.
Компьютерные архитектуры в конечном итоге остановились на восьми битах в качестве наименьшего адресуемого блока памяти, известного как байт. Поскольку ASCII был 7-битным, стало возможным использовать этот восьмой бит для указания дополнительных 128 символов.
Это привело к появлению большого количества несовместимых 8-битных кодировок для разных языков. Они в основном согласились с тем, что первые 128 символов совместимы с ASCII, но в остальном это был хаос. Все это описано в разных частях данной спецификации:
То есть ISO 8859-1 был для западноевропейских языков, 8859-2 для центральноевропейских, 8859-4 для североевропейских, 8859-5 для кириллицы, 8859-7 для греческого и т. Д.Отправка документов между этими языковыми группами была сложной, и было невозможно создать единый документ, содержащий несколько языков, из несовместимых кодировок.
В качестве небольшого примера возьмем символ в позиции EC₁₆ = 236₁₀. Все эти кодировки расходятся во мнениях относительно того, каким оно должно быть:
- ISO 8859-1: ì — СТРОЧНАЯ ЛАТИНСКАЯ БУКВА I С ТЯЖЕЛЫМ
- ISO 8859-2: ě — СТРОЧНАЯ ЛАТИНСКАЯ БУКВА E с КАРОН
- ISO 8859-4: ė — СТРОЧНАЯ ЛАТИНСКАЯ БУКВА E с ТОЧКОЙ ВЫШЕ
- ISO 8859-5: ü — КИРИЛИЧЕСКАЯ СТРОЧНАЯ БУКВА МЯГКИЙ ЗНАК
- ISO 8859-7: μ — ГРЕЧЕСКАЯ СТРОЧНАЯ БУКВА MU
- Mac OS Роман: Ï — ЛАТИНСКАЯ ЗАГЛАВНАЯ БУКВА I С ДИАРЕЗИСОМ
- IBM PC: ∞ — БЕСКОНЕЧНОСТЬ
Вы все еще можете увидеть остатки этой старой несовместимой системы кодирования в меню вашего браузера.Большинство веб-страниц сегодня будет в Юникоде — мы скоро вернемся к этому, — но браузер по-прежнему поддерживает эти в основном устаревшие кодировки, поэтому он может показывать вам веб-страницы, написанные с их помощью. Обратите внимание, что даже для одного и того же языка часто доступно несколько вариантов кодирования.
Чтобы справиться с этой проблемой несовместимых кодировок в разных языковых группах, Консорциум Unicode был основан с удивительной и благородной целью разработки одной кодировки , которая содержала бы на каждые символов и символов, используемых в на каждом языке на планете.
Вы можете получить представление о разнообразии и масштабах этой цели, просмотрев таблицы кодов на веб-сайте Unicode:
Каждый из них представляет собой файл PDF, относящийся к определенному региону, языку или системе символов. В общей сложности это около ста тысяч символов.
В кодовых таблицах каждому возможному символу присваивается отдельный номер, но все еще остается вопрос, как кодировать эти числа как биты. Большинство чисел умещается в 16-битном формате, поэтому в кодовых таблицах они выражаются четырьмя шестнадцатеричными цифрами (например, 1F30 для греческой йоты с акцентом: ἰ ).Но 2¹⁶ — это 65 536, и мы сказали, что было около 100 000 символов, поэтому, очевидно, 16 бит недостаточно. Большую часть времени Unicode представлен в виде многобайтовой (переменной) кодировки под названием UTF-8. Исходные символы ASCII по-прежнему представлены в виде одного байта, но установка восьмого бита позволяет использовать умный механизм, который указывает, сколько байтов следует за ними. Вот хорошее объяснение Unicode и UTF-8 от Тома Скотта на Computerphile:
В настоящее время Unicode работает практически везде, и почти все новое содержимое использует его.По-прежнему иногда возникает проблема с тем, установлены ли на вашем компьютере правильные шрифты, содержащие все необходимые символы. Иногда вместо неподдерживаемого символа появляется поле. Вот один и тот же текст, отображаемый в трех разных системах:
На приведенном выше изображении все персонажи отлично показаны. В приведенном ниже не хватает нескольких символов.
Наконец, приведенная ниже система не может отображать какие-либо символы, кроме символов ASCII.
Base64 Кодирование «буквы» — Base64 Encode and Decode
Около Встречайте Base64 Decode and Encode, простой онлайн-инструмент, который делает именно то, что говорит: декодирует из кодировки Base64, а также быстро и легко кодирует в нее.Base64 кодирует ваши данные без проблем или декодирует их в удобочитаемый формат. Схемы кодированияBase64 обычно используются, когда необходимо кодировать двоичные данные, особенно когда эти данные необходимо хранить и передавать на носителях, предназначенных для работы с текстом. Это кодирование помогает гарантировать, что данные останутся нетронутыми без изменений во время транспортировки. Base64 обычно используется в ряде приложений, включая электронную почту через MIME, а также для хранения сложных данных в XML или JSON.
Дополнительные параметры
- Набор символов: На нашем веб-сайте используется набор символов UTF-8, поэтому ваши входные данные передаются в этом формате. Измените этот параметр, если вы хотите преобразовать данные в другой набор символов перед кодированием. Обратите внимание, что в случае текстовых данных схема кодирования не содержит набора символов, поэтому вам может потребоваться указать соответствующий набор в процессе декодирования. Что касается файлов, по умолчанию используется двоичный параметр, который не учитывает преобразование; эта опция требуется для всего, кроме текстовых документов.
- Разделитель новой строки: В системах Unix и Windows используются разные символы разрыва строки, поэтому перед кодированием любой вариант будет заменен в ваших данных выбранным параметром. Для раздела файлов это частично не имеет значения, поскольку файлы уже содержат соответствующие разделители, но вы можете определить, какой из них использовать для функций «кодировать каждую строку отдельно» и «разбивать строки на фрагменты».
- Кодируйте каждую строку отдельно: Даже символы новой строки преобразуются в их закодированные в Base64 формы.Используйте эту опцию, если вы хотите закодировать несколько независимых записей данных, разделенных разрывами строк. (*)
- Разделить строки на фрагменты: Закодированные данные станут непрерывным текстом без пробелов, поэтому отметьте этот параметр, если хотите разбить его на несколько строк. Применяемое ограничение на количество символов определено в спецификации MIME (RFC 2045), в которой указано, что длина закодированных строк не должна превышать 76 символов. (*)
- Выполнить безопасное кодирование URL: Использование стандартного Base64 в URL требует кодирования символов «+», «/» и «=» в их процентной кодированной форме, что делает строку излишне длиннее.Включите эту опцию для кодирования в вариант Base64, удобный для URL и имени файла (RFC 4648 / Base64URL), где символы «+» и «/» соответственно заменены на «-» и «_», а также заполнение «= знаки опущены.
- Режим реального времени: Когда вы включаете эту опцию, введенные данные немедленно кодируются с помощью встроенных функций JavaScript вашего браузера, без отправки какой-либо информации на наши серверы. В настоящее время этот режим поддерживает только набор символов UTF-8.
Надежно и надежно
Все коммуникации с нашими серверами осуществляются через безопасные зашифрованные соединения SSL (https). Мы удаляем загруженные файлы с наших серверов сразу после обработки, а полученный загружаемый файл удаляется сразу после первой попытки загрузки или 15 минут бездействия (в зависимости от того, что короче). Мы никоим образом не храним и не проверяем содержимое отправленных данных или загруженных файлов. Ознакомьтесь с нашей политикой конфиденциальности ниже для получения более подробной информации.
Совершенно бесплатно
Наш инструмент можно использовать бесплатно.Отныне для таких простых задач не нужно скачивать никакого программного обеспечения.
Подробная информация о кодировании Base64
Base64 — это общий термин для ряда аналогичных схем кодирования, которые кодируют двоичные данные, обрабатывая их численно и переводя в представление base-64. Термин Base64 происходит от конкретной кодировки передачи содержимого MIME.
Дизайн
Конкретный выбор символов для создания 64 символов, необходимых для Base64, зависит от реализации.Общее правило состоит в том, чтобы выбрать набор из 64 символов, который является 1) частью подмножества, общего для большинства кодировок, и 2) также пригодным для печати. Эта комбинация оставляет маловероятным изменение данных при передаче через такие системы, как электронная почта, которые традиционно не были 8-битными. Например, реализация MIME Base64 использует A-Z, a-z и 0-9 для первых 62 значений, а также «+» и «/» для последних двух. Другие варианты, обычно производные от Base64, разделяют это свойство, но отличаются символами, выбранными для последних двух значений; Примером является безопасный для URL и имени файла вариант «RFC 4648 / Base64URL», в котором используются «-» и «_».
Пример
Вот отрывок цитаты из Левиафана Томаса Гоббса:
« Человек отличается не только по своей причине, но и … »
Это представлено как последовательность байтов ASCII и закодировано в MIME. Схема Base64 выглядит следующим образом:
TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCAuLi4 =
В приведенной выше цитате закодированное значение Man 9030Fu составляет Man 9030. Закодированные в ASCII буквы «M», «a» и «n» сохраняются как байты 77, 97, 110, которые эквивалентны «01001101», «01100001» и «01101110» в базе 2.Эти три байта объединяются в 24-битный буфер, образуя двоичную последовательность «010011010110000101101110». Пакеты из 6 бит (6 бит имеют максимум 64 различных двоичных значения) преобразуются в 4 числа (24 = 4 * 6 бит), которые затем преобразуются в соответствующие им значения в Base64.
Как показывает этот пример, кодирование Base64 преобразует 3 некодированных байта (в данном случае символы ASCII) в 4 закодированных символа ASCII.
Безболезненное руководство — Настоящий Python
Работа с кодировками символов в Python или любом другом языке временами может показаться болезненной.В таких местах, как Stack Overflow, есть тысячи вопросов, возникающих из-за путаницы с исключениями, такими как UnicodeDecodeError
и UnicodeEncodeError
. Это руководство предназначено для устранения тумана Exception
и демонстрации того, что работа с текстовыми и двоичными данными в Python 3 может быть удобной. Поддержка Unicode в Python сильна и надежна, но для ее освоения требуется время.
Этот учебник отличается тем, что он не зависит от языка, а вместо этого намеренно ориентирован на Python.Вы все равно получите учебник, не зависящий от языка, но затем вы погрузитесь в иллюстрации на Python с минимальным количеством текстовых абзацев. Вы увидите, как использовать концепции кодировок символов в живом коде Python.
К концу этого руководства вы получите:
- Получите концептуальные обзоры кодировок символов и систем нумерации
- Узнайте, как кодирование вступает в игру с помощью Python
str
ибайт
- Знайте о поддержке в Python систем нумерации с помощью различных форм
int
литералов - Ознакомиться со встроенными функциями Python, связанными с кодировками символов и системами нумерации
Системы кодирования и нумерации символов настолько тесно связаны, что их нужно рассматривать в одном учебном пособии, иначе обработка любой из них была бы совершенно неадекватной.
Примечание : эта статья ориентирована на Python 3. В частности, все примеры кода в этом руководстве были сгенерированы из оболочки CPython 3.7.2, хотя все второстепенные версии Python 3 должны вести себя (в основном) одинаково при обработке текста.
Если вы все еще используете Python 2 и вас пугают различия в том, как Python 2 и Python 3 обрабатывают текстовые и двоичные данные, то, надеюсь, это руководство поможет вам сделать переход.
Что такое кодировка символов?
Существуют десятки, если не сотни кодировок символов.Лучший способ понять, что это такое, — рассмотреть одну из простейших кодировок символов — ASCII.
Независимо от того, являетесь ли вы самоучкой или имеете формальное образование в области информатики, скорее всего, вы видели таблицу ASCII один или два раза. ASCII — хорошее место для начала изучения кодировки символов, потому что это небольшая и ограниченная кодировка. (Как оказалось, слишком мало.)
Включает:
- Строчные английские буквы : a от до z
- Заглавные английские буквы : A от до Z
- Некоторые знаки препинания и символы :
"$"
и"!"
, чтобы назвать пару - Пробельные символы : фактический пробел (
""
), а также новая строка, возврат каретки, горизонтальная табуляция, вертикальная табуляция и некоторые другие - Некоторые непечатаемые символы : символы, такие как backspace,
"\ b"
, которые нельзя напечатать буквально так, как буква A может
Итак, какое более формальное определение кодировки символов?
На очень высоком уровне это способ преобразования символов (таких как буквы, знаки препинания, символы, пробелы и управляющие символы) в целые числа и, в конечном итоге, в биты.Каждый символ может быть закодирован в уникальную последовательность битов. Не волнуйтесь, если вы не уверены в концепции битов, потому что мы скоро к ним вернемся.
Различные выделенные категории представляют собой группы персонажей. Каждому отдельному символу соответствует код , который можно рассматривать как целое число. В таблице ASCII символы разбиты на разные диапазоны:
Диапазон кодовой точки | Класс |
---|---|
от 0 до 31 | Управляющие / непечатаемые символы |
32-64 | Пунктуация, символы, числа и пробел |
65-90 | Заглавные буквы английского алфавита |
91–96 | Дополнительные графемы, например [ и \ |
97–122 | Строчные буквы английского алфавита |
от 123 до 126 | Дополнительные графемы, такие как { и | |
127 | Управляющий / непечатаемый символ ( DEL ) |
Вся таблица ASCII содержит 128 символов.В этой таблице содержится полный набор символов , разрешенный ASCII. Если вы не видите здесь символа, вы просто не можете выразить его как печатный текст в схеме кодирования ASCII.
Кодовая точка | Персонаж (Имя) | Кодовая точка | Персонаж (Имя) |
---|---|---|---|
0 | NUL (Нуль) | 64 | @ |
1 | SOH (начало заголовка) | 65 | А |
2 | STX (начало текста) | 66 | В |
3 | ETX (конец текста) | 67 | С |
4 | EOT (конец передачи) | 68 | Д |
5 | ENQ (Запрос) | 69 | E |
6 | ACK (подтверждение) | 70 | Факс |
7 | BEL (Звонок) | 71 | G |
8 | BS (Backspace) | 72 | H |
9 | HT (горизонтальный выступ) | 73 | Я |
10 | LF (перевод строки) | 74 | Дж |
11 | VT (вертикальный выступ) | 75 | К |
12 | FF (подача формы) | 76 | л |
13 | CR (возврат каретки) | 77 | M |
14 | SO (сдвиг) | 78 | № |
15 | SI (сдвиг внутрь) | 79 | О |
16 | DLE (выход из канала передачи данных) | 80 | п. |
17 | DC1 (Управление устройством 1) | 81 | Q |
18 | DC2 (Управление устройством 2) | 82 | R |
19 | DC3 (Управление устройством 3) | 83 | S |
20 | DC4 (Управление устройством 4) | 84 | т |
21 | NAK (отрицательное подтверждение) | 85 | U |
22 | SYN (синхронный холостой ход) | 86 | В |
23 | ETB (конец блока передачи) | 87 | Вт |
24 | CAN (Отмена) | 88 | X |
25 | EM (конец среднего) | 89 | Y |
26 | SUB (Заменитель) | 90 | Z |
27 | ESC (выход) | 91 | [ |
28 | FS (Разделитель файлов) | 92 | \ |
29 | GS (Разделитель групп) | 93 | ] |
30 | RS (Разделитель записей) | 94 | ^ |
31 | США (разделитель единиц) | 95 | _ |
32 | SP (Космос) | 96 | ` |
33 | ! | 97 | a |
34 | " | 98 | б |
35 | # | 99 | c |
36 | $ | 100 | д |
37 | % | 101 | e |
38 | и | 102 | f |
39 | ' | 103 | г |
40 | ( | 104 | ч |
41 | ) | 105 | i |
42 | * | 106 | j |
43 | + | 107 | к |
44 | , | 108 | л |
45 | - | 109 | м |
46 | . | 110 | n |
47 | / | 111 | o |
48 | 0 | 112 | п. |
49 | 1 | 113 | q |
50 | 2 | 114 | r |
51 | 3 | 115 | с |
52 | 4 | 116 | т |
53 | 5 | 117 | u |
54 | 6 | 118 | v |
55 | 7 | 119 | w |
56 | 8 | 120 | x |
57 | 9 | 121 | y |
58 | : | 122 | z |
59 | ; | 123 | { |
60 | < | 124 | | |
61 | = | 125 | } |
62 | > | 126 | ~ |
63 | ? | 127 | DEL (удалить) |
Строка
Модуль Модуль Python string
- это удобный универсальный инструмент для строковых констант, которые попадают в набор символов ASCII._` {|} ~ "" "
printable = цифры + ascii_letters + знаки препинания + пробелы
Большинство этих констант должны самодокументироваться в своих именах идентификаторов. Вскоре мы рассмотрим, что такое шестнадцатеричных цифр
и восьмицифровых цифр
.
Эти константы можно использовать для повседневных операций со строками:
>>> >>> импортная строка
>>> s = "Что не так с ASCII?!?!?"
>>> s.rstrip (строка. пунктуация)
"Что не так с ASCII"
Примечание : строка .printable
включает в себя все string.whitespace
. Это немного не согласуется с другим методом проверки того, считается ли символ пригодным для печати, а именно str.isprintable ()
, который сообщит вам, что ни один из {'\ v', '\ n', '\ r', '\ f ',' \ t '}
считаются пригодными для печати.
Тонкое различие связано с определением: str.isprintable ()
считает что-то печатаемым, если «все его символы считаются печатаемыми в repr ()
.”
Немного освежить
Сейчас хорошее время для краткого освежения информации о bit , наиболее фундаментальной единице информации, которую знает компьютер.
Бит — это сигнал, который имеет только два возможных состояния. Есть разные способы символического представления бита, которые означают одно и то же:
- 0 или 1
- «да» или «нет»
-
Верно
илиЛожно
- «включено» или «выключено»
Наша таблица ASCII из предыдущего раздела использует то, что мы с вами называем просто числами (от 0 до 127), но более точно называемые числами с основанием 10 (десятичными).
Вы также можете выразить каждое из этих чисел с основанием 10 последовательностью битов (основание 2). Вот двоичные версии от 0 до 10 в десятичном виде:
Десятичное число | Двоичный (компактный) | Двоичный (заполненная форма) |
---|---|---|
0 | 0 | 00000000 |
1 | 1 | 00000001 |
2 | 10 | 00000010 |
3 | 11 | 00000011 |
4 | 100 | 00000100 |
5 | 101 | 00000101 |
6 | 110 | 00000110 |
7 | 111 | 00000111 |
8 | 1000 | 00001000 |
9 | 1001 | 00001001 |
10 | 1010 | 00001010 |
Обратите внимание, что по мере увеличения десятичного числа n вам потребуется больше значащих битов для представления набора символов до этого числа включительно.
Вот удобный способ представить строки ASCII как последовательности битов в Python. Каждый символ из строки ASCII получает псевдокодирование в 8 бит с пробелами между 8-битными последовательностями, каждая из которых представляет один символ:
>>> >>> def make_bitseq (s: str) -> str:
... если не s.isascii ():
... поднять ValueError ("Допускается только ASCII")
... return "" .join (f "{ord (i): 08b}" для i в s)
>>> make_bitseq ("биты")
'01100010 01101001 01110100 01110011'
>>> make_bitseq ("ЗАГЛАВКИ")
'01000011 01000001 01010000 01010011'
>>> make_bitseq ("25 долларов.43 ")
'00100100 00110010 00110101 00101110 00110100 00110011'
>>> make_bitseq ("~ 5")
'01111110 00110101'
Примечание : .isascii ()
был введен в Python 3.7.
Строка f f "{ord (i): 08b}"
использует мини-язык спецификации формата Python, который является способом указания форматирования для полей замены в строках формата:
Левая часть двоеточия,
ord (i)
, представляет собой фактический объект, значение которого будет отформатировано и вставлено в вывод.Использование функции Pythonord ()
дает вам кодовую точку base-10 для одного символаstr
.Правая часть двоеточия — это спецификатор формата.
08
означает шириной 8, 0 с дополнением , аb
функционирует как знак для вывода результирующего числа с основанием 2 (двоичное).
Этот трюк предназначен в основном для развлечения, и он очень плохо подойдет для любого символа, который вы не видите в таблице ASCII.Позже мы обсудим, как другие кодировки решают эту проблему.
Нам нужно больше бит!
Есть критически важная формула, связанная с определением бита. Учитывая количество бит, n , количество различных возможных значений, которые могут быть представлены в n битах, составляет 2 n :
def n_possible_values (nbits: int) -> int:
вернуть 2 ** нбит
Вот что это значит:
- 1 бит позволит вам выразить 2 1 == 2 возможных значений.
- 8 бит позволят вам выразить 2 8 == 256 возможных значений.
- 64 бита позволят вам выразить 2 64 == 18,446,744,073,709,551,616 возможных значений.
Из этой формулы следует следствие: учитывая диапазон различных возможных значений, как мы можем найти количество битов, n , которое требуется для полного представления диапазона? Вы пытаетесь найти n в уравнении 2 n = x (где вы уже знаете x ).
Вот что из этого получается:
>>> >>> из математического импорта ceil, log
>>> def n_bits_required (nvalues: int) -> int:
... вернуть ceil (log (nvalues) / log (2))
>>> n_bits_required (256)
8
Причина, по которой вам нужно использовать потолок в n_bits_required ()
, состоит в том, чтобы учесть значения, которые не являются чистыми степенями 2. Скажем, вам нужно сохранить набор символов из 110 символов. Наивно, это должно занять log (110) / log (2) == 6.781
бит, но нет такого понятия, как 0,781 бит. 110 значений потребуют 7 бит, а не 6, при этом последние слоты не нужны:
>>> n_bits_required (110)
7
Все это служит доказательством одной концепции: ASCII, строго говоря, является 7-битным кодом. Таблица ASCII, которую вы видели выше, содержит 128 кодовых точек и символов, от 0 до 127 включительно. Для этого требуется 7 бит:
>>> >>> n_bits_required (128) # от 0 до 127
7
>>> n_possible_values (7)
128
Проблема в том, что современные компьютеры почти ничего не хранят в 7-битных слотах.Они передают данные в единицах по 8 бит, обычно известных как байт .
Примечание : В этом руководстве я предполагаю, что байт относится к 8 битам, как это было с 1960-х годов, а не к какой-либо другой единице хранения. Вы можете называть это октетом октет , если хотите.
Это означает, что дисковое пространство, используемое ASCII, наполовину пусто. Если неясно, почему это так, вспомните приведенную выше таблицу преобразования десятичных чисел в двоичные. Вы можете выразить числа 0 и 1 всего одним битом, или вы можете использовать 8 бит, чтобы выразить их как 00000000 и 00000001, соответственно.
Вы, , можете выразить числа от 0 до 3 всего с 2 битами или от 00 до 11, или вы можете использовать 8 бит, чтобы выразить их как 00000000, 00000001, 00000010 и 00000011, соответственно. Самая высокая кодовая точка ASCII, 127, требует только 7 значащих битов.
Зная это, вы можете видеть, что make_bitseq ()
преобразует строки ASCII в представление байтов str
, где каждый символ занимает один байт:
>>> make_bitseq ("биты")
'01100010 01101001 01110100 01110011'
Недостаточное использованиеASCII 8-битных байтов, предлагаемых современными компьютерами, привело к семейству конфликтующих, неформальных кодировок, каждая из которых определяла дополнительные символы, которые должны использоваться с оставшимися 128 доступными кодовыми точками, разрешенными в схеме кодирования 8-битных символов.
Мало того, что эти разные кодировки конфликтовали друг с другом, но и каждая из них сама по себе все еще была крайне неполным представлением персонажей мира, несмотря на то, что они использовали один дополнительный бит.
Спустя годы одна мега-схема кодирования символов стала управлять всеми ими. Однако, прежде чем мы перейдем к делу, давайте поговорим на минутку о системах нумерации, которые являются фундаментальной основой схем кодирования символов.
Покрытие всех баз: другие системы счисления
При обсуждении ASCII выше вы видели, что каждый символ отображается на целое число в диапазоне от 0 до 127.
Этот диапазон чисел выражается в десятичной системе счисления (основание 10). Это способ, которым вы, я и остальные из нас, людей, привыкли считать, и нет более сложной причины, чем то, что у нас 10 пальцев.
Но есть и другие системы нумерации, которые особенно распространены в исходном коде CPython. Хотя «базовое число» одно и то же, все системы нумерации — это просто разные способы выражения одного и того же числа.
Если бы я спросил вас, какое число представляет собой строка "11"
, вы были бы правы, бросив на меня странный взгляд, прежде чем ответить, что оно представляет собой одиннадцать.
Однако это строковое представление может выражать разные базовые числа в разных системах нумерации. Помимо десятичной дроби, альтернативы включают следующие общие системы нумерации:
- Двоичный : базовый 2
- Octal : база 8
- Шестнадцатеричный (шестнадцатеричный) : основание 16
Но что для нас означает утверждение, что в определенной системе счисления числа представлены в базе N ?
Вот лучший из известных мне способов сформулировать, что это означает: это количество пальцев, на которые вы рассчитываете в этой системе.
Если вы хотите более полное, но все же мягкое введение в системы нумерации, книга Чарльза Петцольда Code — невероятно крутая книга, в которой подробно исследуются основы компьютерного кода.
Один из способов продемонстрировать, как разные системы нумерации интерпретируют одно и то же, — использовать конструктор Python int ()
. Если вы передадите str
в int ()
, Python по умолчанию будет считать, что строка выражает число в базе 10, если вы не укажете иное:
>>> int ('11 ')
11
>>> int ('11 ', base = 10) # 10 уже по умолчанию
11
>>> int ('11 ', base = 2) # Двоичный
3
>>> int ('11 ', base = 8) # Восьмеричный
9
>>> int ('11 ', base = 16) # Шестнадцатеричный
17
Существует более распространенный способ сообщить Python, что ваше целое число набрано с основанием, отличным от 10.Python принимает буквальных форм каждой из трех альтернативных систем нумерации, указанных выше:
Тип литерала | Префикс | Пример |
---|---|---|
н / д | н / д | 11 |
Двоичный литерал | 0b или 0B | 0b11 |
Восьмеричный литерал | 0o или 0O | 0o11 |
Буквенный шестигранник | 0x или 0X | 0x11 |
Все это подформы целочисленных литералов .Вы можете видеть, что они дают те же результаты, что и вызовы int ()
с нестандартными значениями base
. Все они просто от
до Python:
>>> 11
11
>>> 0b11 # Двоичный литерал
3
>>> 0o11 # Восьмеричный литерал
9
>>> 0x11 # шестнадцатеричный литерал
17
Вот как вы можете ввести двоичный, восьмеричный и шестнадцатеричный эквиваленты десятичных чисел от 0 до 20. Любой из них совершенно допустим в оболочке интерпретатора Python или в исходном коде, и все они имеют тип int
:
Десятичное число | двоичный | восьмеричное | шестигранник |
---|---|---|---|
0 | 0b0 | 0o0 | 0x0 |
1 | 0b1 | 0o1 | 0x1 |
2 | 0b10 | 0o2 | 0x2 |
3 | 0b11 | 0o3 | 0x3 |
4 | 0b100 | 0o4 | 0x4 |
5 | 0b101 | 0o5 | 0x5 |
6 | 0b110 | 0o6 | 0x6 |
7 | 0b111 | 0o7 | 0x7 |
8 | 0b1000 | 0o10 | 0x8 |
9 | 0b1001 | 0o11 | 0x9 |
10 | 0b1010 | 0o12 | 0xa |
11 | 0b1011 | 0o13 | 0xb |
12 | 0b1100 | 0o14 | 0xc |
13 | 0b1101 | 0o15 | 0xd |
14 | 0b1110 | 0o16 | 0xe |
15 | 0b1111 | 0o17 | 0xf |
16 | 0b10000 | 0o20 | 0x10 |
17 | 0b10001 | 0o21 | 0x11 |
18 | 0b10010 | 0o22 | 0x12 |
19 | 0b10011 | 0o23 | 0x13 |
20 | 0b10100 | 0o24 | 0x14 |
Удивительно, насколько распространены эти выражения в стандартной библиотеке Python.Если вы хотите в этом убедиться, перейдите туда, где находится ваш каталог lib / python3.7 /
, и проверьте использование шестнадцатеричных литералов, например:
$ grep -nri --include "* \. Py" -e "\ b0x" lib / python3.7
Это должно работать в любой системе Unix, которая имеет grep
. Вы можете использовать «\ b0o»
для поиска восьмеричных литералов или «\ b0b» для поиска двоичных литералов.
Каков аргумент в пользу использования этих альтернативных синтаксисов литералов int
? Короче говоря, это потому, что 2, 8 и 16 — это степени двойки, а 10 — нет.Эти три альтернативные системы счисления иногда предлагают способ выражения значений в удобной для компьютера манере. Например, число 65536 или 2 16 — это всего лишь 10000 в шестнадцатеричном формате или 0x10000
в шестнадцатеричном формате Python.
Введите Unicode
Как вы видели, проблема с ASCII заключается в том, что это недостаточно большой набор символов, чтобы вместить мировой набор языков, диалектов, символов и глифов. (Его даже недостаточно для одного английского.)
Unicode в основном служит той же цели, что и ASCII, но он просто охватывает способ, путь, способ большего набора кодовых точек. Есть несколько кодировок, которые возникли в хронологическом порядке между ASCII и Unicode, но на самом деле о них пока не стоит упоминать, потому что Unicode и одна из его схем кодирования, UTF-8, стали широко использоваться.
Думайте о Юникоде как об огромной версии таблицы ASCII, имеющей 1114 112 возможных кодовых точек. Это от 0 до 1,114,111 или от 0 до 17 * (2 16 ) — 1 или 0x10ffff
в шестнадцатеричном формате.Фактически, ASCII — идеальное подмножество Unicode. Первые 128 символов в таблице Unicode в точности соответствуют символам ASCII, которые вы от них ожидали.
Для технической точности сам код Unicode — это , а не как кодировка . Скорее, Unicode — это , реализованный с помощью различных кодировок символов, которые вы скоро увидите. Unicode лучше рассматривать как карту (что-то вроде dict
) или таблицу базы данных с двумя столбцами.Он отображает символы (например, "a"
, "¢"
или даже "ቈ"
) в различные положительные целые числа. Кодировка символов должна предлагать немного больше.
Unicode содержит практически все символы, которые вы можете себе представить, включая дополнительные непечатаемые. Один из моих любимых — надоедливый знак с написанием справа налево, который имеет кодовую точку 8207 и используется в тексте с языковыми алфавитами как слева направо, так и справа налево, например в статьях, содержащих абзацы на английском и арабском языках. .
Примечание: Мир кодировок символов — одна из многих мелких технических деталей, над которыми некоторые люди любят придираться. Одна из таких деталей заключается в том, что фактически можно использовать только 1111998 кодовых точек Unicode по нескольким архаичным причинам.
Unicode против UTF-8
Людям не потребовалось много времени, чтобы понять, что все символы мира не могут быть упакованы в один байт каждый. Из этого очевидно, что современные, более полные кодировки должны использовать несколько байтов для кодирования некоторых символов.
Вы также видели выше, что Unicode технически не является полноценной кодировкой символов. Это почему?
Есть одна вещь, о которой Unicode не говорит вам: он не говорит вам, как получить фактические биты из текста, а только кодовые точки. В нем недостаточно информации о том, как преобразовать текст в двоичные данные и наоборот.
Unicode — это абстрактный стандарт кодирования, а не кодирование. Вот где в игру вступают UTF-8 и другие схемы кодирования. Стандарт Unicode (карта символов для кодовых точек) определяет несколько различных кодировок из своего единственного набора символов.
UTF-8, а также его менее используемые родственники, UTF-16 и UTF-32, являются форматами кодирования для представления символов Unicode в виде двоичных данных из одного или нескольких байтов на символ. Мы обсудим UTF-16 и UTF-32 чуть позже, но UTF-8, безусловно, занял самую большую долю пирога.
Это подводит нас к давно назревшему определению. Что означает формально кодировать и декодировать ?
Кодирование и декодирование в Python 3
Тип Python 3 str
предназначен для представления удобочитаемого текста и может содержать любой символ Юникода.
Тип байт
, наоборот, представляет двоичные данные или последовательности необработанных байтов, которые по сути не имеют прикрепленной к нему кодировки.
Кодирование и декодирование — это процесс перехода от одного к другому:
Кодирование и декодирование (Изображение: Real Python) В .encode ()
и .decode ()
параметр кодировки
по умолчанию равен «utf-8»
, хотя, как правило, более безопасно и однозначно указывать это:
>>> "резюме".кодировать ("utf-8")
b'r \ xc3 \ xa9sum \ xc3 \ xa9 '
>>> "Эль-Ниньо" .encode ("utf-8")
b'El Ni \ xc3 \ xb1o '
>>> b "r \ xc3 \ xa9sum \ xc3 \ xa9" .decode ("utf-8")
'резюме'
>>> b "Эль-Нинь \ xc3 \ xb1o" .decode ("utf-8")
'Эль-Ниньо'
Результатом str.encode ()
является объект байтов байт. Оба байтовых литерала (например,
b "r \ xc3 \ xa9sum \ xc3 \ xa9"
) и представления байтов допускают только символы ASCII.
Вот почему при звонке по номеру «Эль-Ниньо».encode ("utf-8")
, ASCII-совместимый "El"
может быть представлен как есть, но n с тильдой заменяется на "\ xc3 \ xb1"
. Эта запутанная последовательность представляет собой два байта, 0xc3
и 0xb1
в шестнадцатеричном формате:
>>> "" .join (f "{i: 08b}" для i in (0xc3, 0xb1))
'11000011 10110001'
То есть для символа -
требуется два байта для его двоичного представления в UTF-8.
Примечание . Если вы наберете help (str.encode)
, вы, вероятно, увидите значение по умолчанию encoding = 'utf-8'
. Будьте осторожны, исключая это и просто используйте "резюме" .encode ()
, потому что значение по умолчанию может быть другим в Windows до Python 3.6.
Python 3: все на Unicode
Python 3 полностью использует Unicode и UTF-8. Вот что это значит:
Исходный код Python 3 по умолчанию считается UTF-8.Это означает, что вам не нужна кодировка
# - * -: UTF-8 - * -
в верхней частифайлов .py
в Python 3.Весь текст (
str
) по умолчанию - Unicode. Закодированный текст Unicode представлен в виде двоичных данных (байт,
). Типstr
может содержать любой буквальный символ Юникода, например«Δv / Δt»
, и все они будут сохранены как Юникод.Python 3 принимает множество кодовых точек Unicode в идентификаторах, что означает
résumé = "~ / Documents / resume.pdf "
действителен, если это вам нравится.- Модуль
Python
re
по умолчанию использует флагre.UNICODE
, а неre.ASCII
. Это означает, например, чтоr "\ w"
соответствует символам слова Unicode, а не только буквам ASCII. По умолчанию
кодирует
вstr.encode ()
иbytes.decode ()
- это UTF-8.
Есть еще одно свойство, которое является более тонким: кодировка по умолчанию
для встроенного open ()
зависит от платформы и значения локали .getpreferredencoding ()
:
>>> # Mac OS X High Sierra
>>> импортировать локаль
>>> locale.getpreferredencoding ()
'UTF-8'
>>> # Windows Server 2012; другие сборки Windows могут использовать UTF-16
>>> импортировать локаль
>>> locale.getpreferredencoding ()
'cp1252'
Опять же, урок здесь состоит в том, чтобы быть осторожным с предположениями, когда речь идет об универсальности UTF-8, даже если это преобладающая кодировка. Никогда не помешает быть явным в вашем коде.
Один байт, два байта, три байта, четыре
Важнейшей особенностью является то, что UTF-8 представляет собой кодировку с переменной длиной . Заманчиво замалчивать, что это означает, но стоит вникнуть в это.
Вернитесь к разделу, посвященному ASCII. Все в расширенной области ASCII требует не более одного байта пространства. Вы можете быстро доказать это с помощью следующего выражения генератора:
>>> >>> all (len (chr (i) .encode ("ascii")) == 1 для i в диапазоне (128))
Правда
UTF-8 совсем другой.Данный символ Unicode может занимать от одного до четырех байтов. Вот пример одного символа Юникода, занимающего четыре байта:
>>> >>> ibrow = "🤨"
>>> len (ibrow)
1
>>> ibrow.encode ("utf-8")
б '\ xf0 \ x9f \ xa4 \ xa8'
>>> len (ibrow.encode ("utf-8"))
4
>>> # Calling list () для байтового объекта дает вам
>>> # десятичное значение для каждого байта
>>> список (b '\ xf0 \ x9f \ xa4 \ xa8')
[240, 159, 164, 168]
Это тонкая, но важная особенность len ()
:
- Длина одного символа Юникода в Python
str
будет всегда равна 1, независимо от того, сколько байтов он занимает. - Длина одного и того же символа, закодированного в
байтов,
будет где-то между 1 и 4.
В таблице ниже приведены общие типы символов, которые помещаются в каждый сегмент длины в байтах:
Десятичный диапазон | Hex Диапазон | Что включено | Примеры |
---|---|---|---|
от 0 до 127 | "\ u0000" до "\ u007F" | США ASCII | "A" , "\ n" , "7" , "&" |
128 до 2047 | "\ u0080" до "\ u07FF" | Большинство латинских алфавитов * | "ñ" , "±" , "" , "ñ" |
2048 до 65535 | "\ u0800" до "\ uFFFF" | Дополнительные детали многоязычного самолета (БМП) ** | "" , "ᄇ" , "" , "‰" |
65536 до 1114111 | "\ U00010000" до "\ U0010FFFF" | Другое *** | "" , "𐀀" , "😓" , "🂲" , |
* Например, английский, арабский, греческий и ирландский
** Огромный набор языков и символов - в основном китайский, японский и корейский по объему (также ASCII и латинский алфавиты)
*** Дополнительный китайский , Японские, корейские и вьетнамские символы, а также другие символы и смайлы
Примечание : Чтобы не упустить из виду общую картину, существует дополнительный набор технических функций UTF-8, которые здесь не рассматриваются, поскольку они редко видны пользователю Python.
Например, UTF-8 фактически использует коды префикса, которые указывают количество байтов в последовательности. Это позволяет декодеру определять, какие байты принадлежат друг другу в кодировке переменной длины, и позволяет первому байту служить индикатором количества байтов в предстоящей последовательности.
В статьеWikipedia, посвященной UTF-8, не обойтись без технических подробностей, и всегда существует официальный стандарт Unicode, который поможет вам при чтении.
А как насчет UTF-16 и UTF-32?
Вернемся к двум другим вариантам кодировки, UTF-16 и UTF-32.
На практике разница между ними и UTF-8 существенна. Вот пример того, насколько велика разница при двустороннем преобразовании:
>>> >>> letter = "αβγδ"
>>> rawdata = letter.encode ("utf-8")
>>> rawdata.decode ("utf-8")
'αβγδ'
>>> rawdata.decode ("utf-16") # 😧
'뇎닎 돎듎'
В этом случае кодирование четырех греческих букв с помощью UTF-8 и последующее декодирование обратно в текст в UTF-16 приведет к получению текста str
на совершенно другом языке (корейском).
Совершенно неверные результаты, подобные этому, возможны, если одна и та же кодировка не используется в двух направлениях. Два варианта декодирования одного и того же объекта байтов байтов могут дать результаты, которые даже не на одном языке.
В этой таблице указаны диапазон или количество байтов в UTF-8, UTF-16 и UTF-32:
Кодировка | байт на символ (включительно) | переменной длины |
---|---|---|
UTF-8 | с 1 по 4 | Есть |
UTF-16 | от 2 до 4 | Есть |
UTF-32 | 4 | № |
Еще одним любопытным аспектом семейства UTF является то, что UTF-8 не всегда занимает меньше места, чем UTF-16.Это может показаться математически нелогичным, но вполне возможно:
>>> >>> text = "記者 鄭啟源 羅智堅"
>>> len (text.encode ("utf-8"))
26 год
>>> len (text.encode ("utf-16"))
22
Причина этого в том, что кодовые точки в диапазоне от U + 0800
до U + FFFF
(от 2048 до 65535 в десятичной форме) занимают три байта в UTF-8 по сравнению с двумя в UTF-16.
Я ни в коем случае не рекомендую вам садиться в поезд UTF-16, независимо от того, работаете ли вы на языке, символы которого обычно находятся в этом диапазоне.Среди прочего, одним из веских аргументов в пользу использования UTF-8 является то, что в мире кодирования отличная идея - сливаться с толпой.
Не говоря уже о том, что это 2019 год: память компьютера дешевая, поэтому экономия 4 байтов за счет использования UTF-16, вероятно, не стоит того.
Встроенные функции Python
Вы прошли через трудную часть. Пришло время использовать то, что вы уже видели в Python.
Python имеет группу встроенных функций, которые каким-то образом связаны с системами нумерации и кодировкой символов:
Их можно логически сгруппировать в зависимости от их назначения:
ascii ()
,bin ()
,hex ()
иoct ()
предназначены для получения другого представления ввода.Каждый производитstr
. Первый,ascii ()
, создает представление объекта только в формате ASCII с экранированными символами, отличными от ASCII. Остальные три дают двоичное, шестнадцатеричное и восьмеричное представление целого числа соответственно. Это всего лишь представления , а не принципиальное изменение ввода.bytes ()
,str ()
иint ()
являются конструкторами классов для своих соответствующих типов,bytes
,str
иint
.Каждый из них предлагает способы принуждения ввода к желаемому типу. Например, как вы видели ранее, хотяint (11.0)
, вероятно, более распространен, вы также можете увидетьint ('11 ', base = 16)
.ord ()
иchr ()
являются инверсиями друг друга в том смысле, что функция Pythonord ()
преобразует символstr
в его кодовую точку base-10, аchr ()
делает противоположный.
Вот более подробный взгляд на каждую из этих девяти функций:
Функция | Подпись | Принимает | Тип возврата | Цель |
---|---|---|---|---|
ascii () | ascii (obj) | Варьируется | ул. | Представление объекта только в формате ASCII с экранированными символами, отличными от ASCII |
бункер () | бункер (номер) | номер: внутренний | ул. | Двоичное представление целого числа с префиксом «0b» |
байт () | байтов (iterable_of_ints) | Варьируется | байт | Преобразование входных данных в байтов , сырые двоичные данные |
chr () | chr (i) | i: int | ул. | Преобразование целочисленной кодовой точки в один символ Юникода |
шестигранник () | шестигранник (номер) | номер: внутренний | ул. | Шестнадцатеричное представление целого числа с префиксом «0x» |
внутр () | int ([x]) | Варьируется | внутренний | Привести (преобразовать) вход в int |
окт. () | окт (номер) | номер: внутренний | ул. | Восьмеричное представление целого числа с префиксом "0o" |
ord () | орд (в) | c: str | внутренний | Преобразование одиночного символа Юникода в его целочисленную кодовую точку |
ул. () | str (object = ’‘) | Зависит от | ул. | Привести (преобразовать) вход в str , текст |
Вы можете развернуть раздел ниже, чтобы увидеть несколько примеров каждой функции.
ascii ()
дает вам представление объекта только в формате ASCII с экранированными символами, отличными от ASCII:
>>> ascii ("abcdefg")
"'abcdefg'"
>>> ascii ("халепеньо")
"'Джалепе \\ xf1o'"
>>> ascii ((1, 2, 3))
'(1, 2, 3)'
>>> ascii (0xc0ffee) # Шестнадцатеричный литерал (int)
"12648430"
bin ()
дает двоичное представление целого числа с префиксом «0b»
:
>>> корзина (0)
'0b0'
>>> корзина (400)
'0b110010000'
>>> bin (0xc0ffee) # Шестнадцатеричный литерал (int)
'0b110000001111111111101110'
>>> [bin (i) for i in [1, 2, 4, 8, 16]] # `int` + понимание списка
['0b1', '0b10', '0b100', '0b1000', '0b10000']
bytes ()
переводит вход в байтов
, представляя необработанные двоичные данные:
>>> # Итерация целых чисел
>>> байты ((104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100))
привет мир
>>> bytes (range (97, 123)) # Итерация целых чисел
b'abcdefghijklmnopqrstuvwxyz '
>>> bytes ("real 🐍", "utf-8") # Строка + кодировка
б'реал \ xf0 \ x9f \ x90 \ x8d '
>>> байты (10)
б '\ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00'
>>> байтов.fromhex ('c0 ff ee')
б '\ xc0 \ xff \ xee'
>>> bytes.fromhex ("72 65 61 6c 70 79 74 68 6f 6e")
b 'альпифон'
chr ()
преобразует целочисленную кодовую точку в один символ Юникода:
>>> chr (97)
'а'
>>> chr (7048)
'ᮈ'
>>> chr (1114111)
'\ U0010ffff'
>>> chr (0x10FFFF) # Шестнадцатеричный литерал (int)
'\ U0010ffff'
>>> chr (0b01100100) # Двоичный литерал (int)
'd'
hex ()
дает шестнадцатеричное представление целого числа с префиксом «0x»
:
>>> шестнадцатеричный (100)
'0x64'
>>> [hex (i) для i в [1, 2, 4, 8, 16]]
['0x1', '0x2', '0x4', '0x8', '0x10']
>>> [hex (i) для i в диапазоне (16)]
['0x0', '0x1', '0x2', '0x3', '0x4', '0x5', '0x6', '0x7',
'0x8', '0x9', '0xa', '0xb', '0xc', '0xd', '0xe', '0xf']
int ()
приводит к вводу int
, опционально интерпретируя ввод в заданной базе:
>>> int (11.0)
11
>>> int ('11 ')
11
>>> int ('11 ', основание = 2)
3
>>> int ('11 ', основание = 8)
9
>>> int ('11 ', основание = 16)
17
>>> int (0xc0ffee - 1.0)
12648429
>>> int.from_bytes (b "\ x0f", "маленький")
15
>>> int.from_bytes (b '\ xc0 \ xff \ xee', "большой")
12648430
Функция Python ord ()
преобразует один символ Юникода в его целочисленный код:
>>> ord ("а")
97
>>> ord ("ę")
281
>>> ord ("ᮈ")
7048
>>> [ord (i) вместо i в "привет, мир"]
[104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]
str ()
приводит к вводу str
, представляя текст:
>>> str ("строка строки")
'строка строки'
>>> str (5)
'5'
>>> str ([1, 2, 3, 4]) # Как [1, 2, 3, 4].__str __ (), но используйте str ()
'[1, 2, 3, 4]'
>>> str (b "\ xc2 \ xbc чашка муки", "utf-8")
Стакана муки
>>> str (0xc0ffee)
"12648430"
Строковые литералы Python: способы снять шкуру с кошки
Вместо того, чтобы использовать конструктор str ()
, принято вводить str
буквально:
>>> еда = "креветки и крупа"
Это может показаться достаточно простым. Но интересная сторона дела заключается в том, что, поскольку Python 3 полностью ориентирован на Unicode, вы можете «набирать» символы Unicode, которые, вероятно, даже не найдете на клавиатуре.Вы можете скопировать и вставить это прямо в оболочку интерпретатора Python 3:
>>> >>> алфавит = 'αβγδεζηθικλμνξοπρςστυφχψ'
>>> печать (алфавит)
αβγδεζηθικλμνξοπρςστυφχψ
Помимо размещения фактических, неэкранированных символов Unicode в консоли, есть и другие способы ввода строк Unicode.
Один из самых плотных разделов документации Python - это раздел, посвященный лексическому анализу, в частности раздел, посвященный строковым и байтовым литералам.Лично мне пришлось прочитать этот раздел один, два или, может быть, девять раз, чтобы он действительно проникся.
Частично в нем говорится, что существует до шести способов, которыми Python позволяет вам вводить один и тот же символ Unicode.
Первый и самый распространенный способ - набрать сам символ буквально, как вы уже видели. Сложная часть этого метода - это нахождение фактических нажатий клавиш. Вот где в игру вступают другие методы получения и представления персонажей. Вот полный список:
Последовательность побега | Значение | Как выразить "а" |
---|---|---|
"\ ooo" | Знак с восьмеричным числом ооо | "\ 141" |
"\ xhh" | Символ с шестнадцатеричным значением hh | "\ x61" |
"\ N {name}" | Персонаж с именем имя в базе данных Unicode | "\ N {СТРОЧНАЯ ЛАТИНСКАЯ БУКВА A}" |
"\ uxxxx" | Символ с 16-битным (2-байтовым) шестнадцатеричным значением xxxx | "\ u0061" |
"\ Uxxxxxxxx" | Символ с 32-битным (4-байтовым) шестнадцатеричным значением xxxxxxxx | "\ U00000061" |
Вот некоторые доказательства и подтверждения вышеизложенного:
>>> >>> (
... "а" ==
... "\ x61" ==
... "\ N {СТРОЧНАЯ ЛАТИНСКАЯ БУКВА A}" ==
... "\ u0061" ==
... "\ U00000061"
...)
Правда
Теперь есть два основных предостережения:
Не все эти формы подходят для всех персонажей. Шестнадцатеричное представление целого числа 300:
0x012c
, что просто не подходит для 2-значного escape-кода"\ xhh"
. Наивысшая кодовая точка, которую вы можете втиснуть в эту escape-последовательность, - это"\ xff"
("ÿ"
).Аналогично для"\ ooo"
, он будет работать только до"\ 777"
("ǿ"
).Для
\ xhh
,\ uxxxx
и\ Uxxxxxxxx
требуется ровно столько цифр, сколько показано в этих примерах. Это может вызвать зацикливание из-за того, что таблицы Unicode обычно отображают коды символов с ведущимU +
и переменным количеством шестнадцатеричных символов. Ключевым моментом является то, что таблицы Unicode чаще всего не заполняют эти коды нулями.
Например, если вы обратитесь на unicode-table.com за информацией о готической букве faihu (или fehu), "𐍆"
, вы увидите, что она указана как имеющая код U + 10346
.
Как поместить это в "\ uxxxx"
или "\ Uxxxxxxxx"
? Ну, вы не можете поместить его в "\ uxxxx"
, потому что это 4-байтовый символ, и чтобы использовать "\ Uxxxxxxxx"
для представления этого символа, вам нужно будет ввести последовательность слева:
>>> "\ U00010346"
'𐍆'
Это также означает, что форма "\ Uxxxxxxxx"
является единственной escape-последовательностью, которая может содержать любой символ Unicode.
Примечание : Вот короткая функция для преобразования строк, которые выглядят как "U + 10346"
, в нечто, с чем может работать Python. Он использует str.zfill ()
:
>>> def make_uchr (код: str):
... return chr (int (code.lstrip ("U +"). zfill (8), 16))
>>> make_uchr ("U + 10346")
'𐍆'
>>> make_uchr ("U + 0026")
'&'
Другие кодировки, доступные в Python
На данный момент вы видели четыре кодировки символов:
- ASCII
- UTF-8
- UTF-16
- UTF-32
Есть масса других.
Одним из примеров является Latin-1 (также называемый ISO-8859-1), который технически является значением по умолчанию для протокола передачи гипертекста (HTTP) согласно RFC 2616. Windows имеет свой собственный вариант Latin-1, называемый cp1252.
Примечание : ISO-8859-1 все еще широко распространен в дикой природе. Библиотека запросов
следует RFC 2616 «в буквальном смысле» в использовании ее в качестве кодировки по умолчанию для содержимого ответа HTTP или HTTPS. Если слово «текст» найдено в заголовке Content-Type
, и никакая другая кодировка не указана, тогда запросы
будут использовать ISO-8859-1.
Полный список принятых кодировок скрыт в документации для модуля кодеков
, который является частью стандартной библиотеки Python.
Есть еще одна полезная распознанная кодировка, о которой следует знать, это «unicode-escape»
. Если у вас есть декодированный str
и вы хотите быстро получить представление его экранированного литерала Unicode, вы можете указать эту кодировку в .encode ()
:
>>> alef = chr (1575) # Или "\ u0627"
>>> alef_hamza = chr (1571) # Или "\ u0623"
>>> алеф, алеф_хамза
('ا', 'أ')
>>> алеф.кодировать ("unicode-escape")
б '\\ u0627'
>>> alef_hamza.encode ("unicode-escape")
б '\\ u0623'
Вы знаете, что они говорят о предположениях…
Тот факт, что Python делает предположение о кодировке UTF-8 для файлов и кода, который генерирует , который вы генерируете , не означает, что вы, программист, должны работать с тем же допущением для внешних данных.
Давайте повторим это еще раз, потому что это правило, по которому следует жить: когда вы получаете двоичные данные (байты) из стороннего источника, будь то из файла или по сети, лучше всего проверить, что данные указывают кодировку .Если нет, то спросите сами.
Все операции ввода-вывода происходят в байтах, а не в тексте, и байты для компьютера - это только единицы и нули, пока вы не укажете иное, сообщив ему кодировку.
Вот пример того, где что-то может пойти не так. Вы подписаны на API, который отправляет вам рецепт дня, который вы получаете в байтах
и всегда без проблем декодировали с помощью .decode ("utf-8")
. В этот день часть рецепта выглядит так:
>>> data = b "\ xbc чашка муки"
Похоже, что рецепт требует немного муки, но мы не знаем, сколько:
>>> >>> данные.декодировать ("utf-8")
Отслеживание (последний вызов последний):
Файл "", строка 1, в
UnicodeDecodeError: кодек utf-8 не может декодировать байт 0xbc в позиции 0: недопустимый начальный байт
Эээ . Есть эта надоедливая ошибка UnicodeDecodeError
, которая может укусить вас, когда вы делаете предположения о кодировании. Вы уточняете у хоста API. И вот, данные на самом деле отправляются в кодировке Latin-1:
>>> data.decode ("латиница-1")
Стакана муки
Ну вот.В Latin-1 каждый символ помещается в один байт, тогда как символ «¼» занимает два байта в UTF-8 ( "\ xc2 \ xbc"
).
Урок здесь в том, что может быть опасно предполагать кодировку любых данных, которые передаются вам. В наши дни это , обычно это UTF-8, но это небольшой процент случаев, когда это не приведет к взрыву.
Если вам действительно нужно отказаться от поставки и угадать кодировку, то взгляните на библиотеку chardet
, которая использует методологию Mozilla, чтобы сделать обоснованное предположение о неоднозначно закодированном тексте.Тем не менее, такой инструмент, как chardet
, должен быть вашим последним средством, а не первым.
Шансы и окончания:
unicodedata
Было бы упущением не упомянуть unicodedata
из стандартной библиотеки Python, которая позволяет вам взаимодействовать и выполнять поиск в базе данных символов Unicode (UCD):
>>> импортировать unicodedata
>>> unicodedata.name ("€")
«ЗНАК ЕВРО»
>>> unicodedata.lookup («ЗНАК ЕВРО»)
'€'
Заключение
В этой статье вы раскрыли обширную и впечатляющую тему кодировки символов в Python.
Здесь вы уже много узнали:
- Основные концепции кодировок символов и систем нумерации
- Целочисленные, двоичные, восьмеричные, шестнадцатеричные, строковые и байтовые литералы в Python
- Встроенные функции Python, связанные с системами кодировки и нумерации символов
- Обработка текста в Python 3 по сравнению с двоичными данными
Теперь идите и закодируйте!
ресурсов
Чтобы получить более подробную информацию о затронутых здесь темах, посетите эти ресурсы:
В документации Python есть две страницы по теме:
Руководство по диагностике проблем с отображением символов
Когда хорошие символы становятся плохими: руководство по диагностике проблем с отображением символовКогда плохие вещи случаются с хорошими персонажами
Познакомьтесь с персонажем
Может быть полезно знать своих персонажей, но на практике полезно знать хорошо и персонажей.Мой символ - буква «е» с острым ударением, код символа 233 (десятичный) в Latin-1 и Unicode.Вставка символов
Его можно вставить в документ разными способами:- В Windows я, удерживая клавишу Alt, набираю 0233 на цифровой клавиатуре и отпускаю клавишу Alt. Я тоже мог бы использовать программу charmap. Или я мог бы скопировать и вставить его (например, é). Но вводить код напрямую рискованно, потому что при изменении кодировки символов например, от Latin-1 до UTF-8, тогда значение кода 233 меняется.
- В HTML-документе я могу ввести эти магические заклинания,
которые отображаются правильно независимо от кодировки:
- & # 233; (десятичный) ⇒ é
- & # xE9; (шестнадцатеричный) ⇒ é
- & eacute; (мнемоника) ⇒ é
- В Microsoft Word я набираю код с ударением, за которым следует буква с ударением. В Windows Ctrl + кавычка, затем «е». На Mac: Option + кавычка, затем «e».Коды акцента включают: могила = обратная кавычка, острый = кавычка, циркумфлекс = шляпа, двоеточие = умляут, запятая = седиль, тильда = тильда, слэш = слэш и, возможно, другие.
Что могло пойти не так?
Если é закодирован в UTF-8, но отображается без декодирования, это выглядит так:Ã ©
Первые 128 символов в наборе символов Latin-1 (как ASCII), просто представлены как сами себя в UTF-8. Вторая половина символов Latin-1 разделена. Первая половина символов Latin-1, отличных от ASCII, представлена сама собой, ей предшествует десятичный код 194. или C2 в шестнадцатеричном формате, поэтому кодировка UTF-8 для кода символа 191 (десятичный), ¿, будет¿
Вторая половина символов Latin-1, отличных от ASCII, представлена другим символом, Перед ним стоит десятичный код 195 или шестнадцатеричный код C3.Итак, глядя на кодировки UTF-8 символов Latin-1, если вы видите Â или Ã там, где этого не ожидаете, вероятно, слишком много кодировок UTF-8. У нескольких дополнительных кодировок есть шаблон: 0 é
1 Ã ©
2 мк ©
3 ƒÂ ©
4 ’ƒÃ⠀ šÃ‚ ©
5 вы поняли
Слишком мало кодировок может иметь плохой эффект, который выглядит иначе. Когда é не закодирован в UTF-8, он может выглядеть как этот символ с очень большим номером:
�
Прогрессивное недостаточное кодирование может привести к отображению вопросительного знака.Справочная информация по диагностике
Теперь вы готовы диагностировать проблемы с кодировкой UTF-8 (например,г., с é):
Признак | Диагноз |
---|---|
é | нет проблем |
à © | слишком много кодировки UTF-8 или просмотр текста в кодировке UTF-8 с кодировкой Latin-1 |
© | слишком много кодировки UTF-8 |
� | слишком мало кодировки UTF-8 |
? | что-то плохое случилось с этим персонажем |
дикие животные съели этого персонажа | |
𐀓 | Если вы видите поле, в используемом шрифте отсутствует этот символ.Поля Firefox 3 содержат шестнадцатеричное значение отсутствующего символа, но это все еще недостающий персонаж. |
Справочная информация из Википедии
Руководство по кодированию данных и символов для начинающих
Когда я впервые начал работать с компьютерами, все было в коде ASCII ( Американский стандартный код для обмена информацией )
Однако сегодня, работая с сетевыми протоколами и сетевым программированием, вы встретите множество схем кодирования данных и символов.
В этом руководстве мы рассмотрим базовые схемы кодирования , используемые на компьютерах, а во второй части руководства мы рассмотрим, как данные передаются по сети.
символов, целых чисел, чисел с плавающей запятой и т. Д.
При хранении и передаче данных вам необходимо будет представить следующие типы данных:
- Знаки и цифры, например, A и 1
- Целые числа со знаком и без знака, длинные (32 бита) и короткие (16 бит)
- Одиночная и двойная с плавающей запятой
- Логическое i.e Верно и неверно
Так как же компьютер хранит букву А или цифру 1?
Как компьютер хранит число вроде 60101? или 62.0101?
Как передать букву A и т. Д. На другой компьютер по сети?
Компьютеры и кодировка символов
Чтобы сохранить текст в виде двоичных данных, вы должны указать для этого текста кодировку .
СистемыComputers могут использовать различные схемы кодирования символов.
Пока данные остаются на компьютере, действительно неважно, как они закодированы.
Однако для передачи данных между системами необходимо принять стандартную схему кодирования.
В 1968 году ASCII (Американский стандартный код для обмена информацией) был принят в качестве стандарта для кодирования текста для обмена данными.
ASCIIASCII - это американский стандарт, предназначенный для кодирования английских символов и знаков препинания, используемых на пишущих машинках и телетайпах той эпохи (1960-е годы).
ASCII использует 8 бит, хотя фактически используются только 7 бит.
Поскольку код ASCII был разработан во время эксплуатации телетайпов, он также содержит управляющих кодов , предназначенных для управления телетайпом.
В таблице ниже приведены сводные данные о присвоении кодов.
Таблица ASCII - сводка кодов | |
Десятичное значение | Использование |
0-31 | Контрольные коды |
32-127 | Печатные символы |
128-255 | Не используется |
Поскольку ASCII не может кодировать символы, такие как знак фунта £, или общие символы, встречающиеся в немецком и других европейских языках, были разработаны различные расширения.
Эти расширения сохранили набор символов ASCII и использовали неиспользуемую часть адресного пространства и управляющие коды для дополнительных символов.
Наиболее распространенными являются windows 1252 и Latin-1 (ISO-8859).
Windows 1252 и 7-битный ASCII были наиболее широко используемыми схемами кодирования до 2008 года, когда UTF-8 стал наиболее распространенным.
ISO-8859-1, ISO-8859-15, Latin-1
ISO-8859 - это 8-битная кодировка символов, которая расширяет 7-битную схему кодирования ASCII и используется для кодирования большинства европейских языков.Подробности см. В вики.
ISO-8859-1 , также известный как Latin-1, является наиболее широко используемым, поскольку его можно использовать для большинства распространенных европейских языков, например, немецкого, итальянского, испанского, французского и т. Д.
Это очень похоже на схему кодирования windows-1252, но не идентично см. - Сравнение символов в Windows-1252, ISO-8859-1, ISO-8859-15
Юникод
Из-за необходимости кодирования символов иностранного языка и других графических символов был разработан набор символов Unicode и схемы кодирования.
Наиболее распространенные схемы кодирования:
UTF-8 - это наиболее часто используемая схема кодирования, используемая в современных компьютерных системах и компьютерных сетях.
Это схема кодирования переменной ширины, которая была разработана для обеспечения полной обратной совместимости с ASCII. Он использует от 1 до 4 байтов. - вики
Наборы символов и схемы кодирования
Разница между этими двумя терминами не всегда ясна, и термины, как правило, используются как взаимозаменяемые.
Набор символов - это список символов, тогда как схема кодирования - это то, как они представлены в двоичном формате.
Лучше всего это видно с Unicode.
В схемах кодирования UTF-8, UTF-16 и UTF-32 используется набор символов Unicode, но символы кодируются по-разному.
ASCII - это набор символов и схема кодирования.
Метка порядка байтов (BOM)
Метка порядка байтов (BOM) - это символ Unicode, U + FEFF , который появляется как магическое число в начале текстового потока и может сигнализировать о нескольких вещах программе, потребляющей текст: –Wiki
- Порядок байтов или порядок байтов текстового потока;
- Тот факт, что кодировка текстового потока - Unicode, с высокой степенью достоверности;
- В какой кодировке Unicode кодируется текстовый поток.
Спецификация отличается для текста в кодировке UTF-8, UTF-16 и UTF-32
Следующая таблица, взятая из Wiki, показывает это.
Редакторы спецификаций и текста
Обычно большинство редакторов обрабатывают спецификации правильно, и они не отображаются.
Программное обеспечение Microsoft, такое как Блокнот, добавляет спецификацию при сохранении данных как UTF-8 и не может интерпретировать текст без спецификации , если это не чистый ASCII.
Пример спецификации
На снимке экрана ниже показан простой текстовый файл, содержащий текст TEST , закодированный как UTF-8 в блокноте:
Вы должны заметить, что символы спецификации не видны.
Ниже представлен вывод простой программы на Python, которая отображает содержимое файла, содержащего символы TEST (4 символа), сохраненные как ASCII , UTF-8, , UTF-16-BE и UTF- 16-LE
Ссылка - Знак порядка байтов (BOM) в HTML
Общие вопросы и ответы
Q-Как узнать, какая кодировка символов используется в файле?
A- Обычно вы этого не делаете, но некоторые текстовые редакторы, такие как notepad ++, отображают кодировку.Если вы получаете файл, который закодирован с использованием кодировки, отличной от ожидаемой, вы можете получить сообщение об ошибке при попытке прочитать его.
Q- Мой файл находится в формате ASCII, но он нормально декодируется с использованием декодера UTF-8. Это почему?
A- Потому что UTF-8 обратно совместим с ASCII.
Целые числа и числа с плавающей запятой - большие и
с прямым порядком байтовПримечание: Поскольку UTF-16 и UTF-32 используют 2- или 4-байтовые целые числа, следующее применяется к кодированию текста с их использованием
Количество байтов, выделенных для типа Integer или float, зависит от системы.
ПунктTutorials охватывает это для языка программирования C , и я буду использовать его для иллюстрации
Если мы возьмем короткое целое число как 2 байта и длинное целое число как 4 байта.
Поскольку они используют несколько байтов, возникает несколько вопросов:
- Какой байт представляет самую значительную часть числа?
- При хранении в памяти, какой байт сохраняется первым
- При отправке по сети, какой байт отправляется первым.
Порядок байтов относится к последовательному порядку, в котором байты упорядочиваются в более крупные числовые значения при сохранении в памяти или при передаче по цифровым каналам.Порядок байтов
представляет интерес в информатике, потому что обычно используются два конфликтующих и несовместимых формата: слова могут быть представлены в формате с прямым порядком байтов или с прямым порядком байтов , в зависимости от того, какие биты, байты или другие компоненты упорядочены из большой конец (самый старший бит) или младший конец (младший бит.
В формате с прямым порядком байтов , всякий раз, когда адресуется память или отправляется / сохраняется слова побайтно, старший значащий байт - байт, содержащий самый старший бит - сохраняется сначала (имеет наименьший адрес) или отправляется первым, затем следующие байты сохраняются или отправляются в порядке убывания значимости, причем наименее значимый байт - тот, который содержит наименее значимый бит - сохраняется последним (с наивысшим адресом) или отправляется последним.Вики
На приведенной ниже иллюстрации с использованием python показано целое число 16, представленное как 4 байта с использованием порядка больших и младшего порядка байтов.
Порядок сетевых и системных байтов
Сетевой порядок байтов относится к порядку байтов при отправке данных по сети. (TCP / IP обычно Big Endian ).
Это означает, что старший байт отправляется первым.
Порядок байтов системы или хоста указывает на то, как байты располагаются при хранении в памяти хост-системы.
ОС Windows - это Little Endian .
Ref- Bit and Byte Видео с заказом
Связанные руководства
Оцените? И используйте Комментарии, чтобы сообщить мне больше
Какие данные закодированы в различных штрих-кодах?
Некоторые типы штрих-кодов или символы кодируют только числа, а другие кодируют буквы и цифры. Другие типы штрих-кодов могут фактически кодировать файлы, изображения и другие двоичные данные. Вот основная разбивка нескольких типов штрих-кодов и того, что они кодируют:
Символика штрих-кода | Типы закодированных данных |
Код 39 | Числа и прописные буквы с несколькими символами |
Код 128 | Все цифры, буквы и знаки препинания плюс ASCII от 0 до 127 |
Матрица данных | Все цифры, буквы и знаки препинания, ASCII от 0 до 127 плюс файлы и байты. |
Чередование 2 из 5 | Только числа |
Код MSI | Только числа |
PDF417 | Все цифры, буквы и знаки препинания, ASCII от 0 до 127 плюс файлы и байты. |
Postnet | Только номера |
Рекомендации по штрих-кодированию:
Если шрифты штрих-кода используются для печати, проверьте тип данных для кодирования:
- Только цифры, до около 20 цифр, выберите Codabar или Interleaved 2 of 5.Codabar - самая плотная самопроверяющаяся символика. ITF - это штрих-код, состоящий только из чисел, используемый для кодирования пар чисел в формате штрих-кода высокой плотности.
- Только прописные буквы, цифры и эти символы (-. $ / +%), Примерно до 15 цифр, выбирайте Code 39. Code 39 - это самый плотный самопроверяющийся буквенно-цифровой тип штрих-кода.
- Прописные и строчные буквы, цифры, знаки препинания, любые буквы или символы, появляющиеся на клавиатуре США, и нижние функции ASCII, такие как возврат и табуляция, до 20-30 цифр, используют код 128.
- Несколько строк данных любого типа, более 20 цифр, используются PDF417, Aztec, QR-CodeorData Matrix.
Если предполагаемое использование - компонент штрих-кода или приложение для печати этикеток, проверьте тип данных для кодирования:
- Прописные или строчные буквы, цифры, знаки препинания, любые буквы или символы, появляющиеся на клавиатуре США и нижний ASCII такие функции, как возврат и табуляция, до 20-30 цифр, используют код 128 , который находится в линейном элементе управления ActiveX, программах печати этикеток, компонентах потоковой передачи для IIS,.NET Forms Controls, ASP.NET Server Controls или продуктов со штрих-кодом Java.
- Несколько строк данных любого типа, более 20 цифр, используйте PDF417 , Aztec , QR Code или Data Matrix , который находится в элементе управления ActiveX, элементах управления .NET Barcode Forms Controls, ASP.NET Server Controls , 2D-шрифты штрих-кода, программы для печати этикеток со штрих-кодом, компонент сервера потоковой передачи для IIS или продуктов Java.
О точности штрих-кода и неправильном считывании
В исследовании, проведенном в Университете Огайо, были протестированы несколько различных символик штрих-кода, чтобы определить их точность, и они перечислены ниже.Имейте в виду, что хорошо обученный оператор ввода данных обычно делает ошибку при вводе данных каждые 300 нажатий клавиш. Следовательно, даже внедрение точной символики минимум - это огромный шаг вперед в увеличении производства и уменьшении количества ошибок при вводе данных.