Код ASCII 7-битный или 8-битный?

101

Мой учитель сказал мне, что ASCII - это 8-битная схема кодирования символов. Но он определен только для кодов 0-127, что означает, что его можно уместить в 7 бит. Так нельзя ли утверждать, что бит ASCII на самом деле является 7-битным кодом?

И что мы вообще имеем в виду, когда говорим, что ASCII - это 8-битный код?

Анураг Калия
источник

Ответы:

93

ASCII действительно изначально задумывался как 7-битный код. Это было сделано задолго до того, как 8-битные байты стали повсеместными, и даже в 1990-е годы можно было найти программное обеспечение, которое предполагало, что может использовать 8-й бит каждого байта текста для своих собственных целей («не 8-битный чистый»). В настоящее время люди думают об этом как о 8-битном коде, в котором байты с 0x80 по 0xFF не имеют определенного значения, но это реткон .

Существуют десятки кодировок текста, в которых используется 8-й бит; они могут быть классифицированы как ASCII-совместимые или нет, а также как с фиксированной или переменной шириной. Совместимость с ASCII означает, что независимо от контекста отдельные байты со значениями от 0x00 до 0x7F кодируют те же символы, что и в ASCII. Вы не хотите иметь ничего общего с кодировкой текста, не совместимой с ASCII, если вы можете этого избежать; наивные программы, ожидающие ASCII, имеют тенденцию неверно интерпретировать их катастрофическим, часто нарушающим безопасность образом. В настоящее время они настолько устарели, что (например) HTML5 запрещает их использование в общедоступной сети, за прискорбным исключением UTF-16 . Я больше не буду о них говорить.

Кодировка с фиксированной шириной означает то, что звучит так: все символы кодируются с использованием одинакового количества байтов. Чтобы быть ASCII-совместимой, фиксированная кодировка должна кодировать все свои символы, используя только один байт, поэтому она может содержать не более 256 символов. Наиболее распространенной в настоящее время такой кодировкой является Windows-1252 , расширение ISO 8859-1 .

В настоящее время стоит знать только одну ASCII-совместимую кодировку переменной ширины, но она очень важна: UTF-8 , которая упаковывает весь Unicode в ASCII-совместимую кодировку. Вы действительно хотите использовать это, если сможете.

В заключение, «ASCII» в настоящее время берет свое практическое определение из Unicode, а не из своего исходного стандарта (ANSI X3.4-1968), потому что исторически существовало несколько десятков вариантов 127-символьного репертуара ASCII - например, некоторые из пунктуация может быть заменена буквами с ударением для облегчения передачи французского текста. В настоящее время все эти варианты устарели, и когда люди говорят «ASCII», они имеют в виду, что байты со значением от 0x00 до 0x7F кодируют кодовые точки Unicode от U + 0000 до U + 007F. Вероятно, это будет иметь значение для вас только в том случае, если вы когда-нибудь столкнетесь с написанием технического стандарта.

Если вас интересует история ASCII и предшествующих ему кодировок, начните с статьи «Эволюция кодов символов, 1874-1968» (копия самиздата по адресу http://falsedoor.com/doc/ascii_evolution-of- character -code.pdf ), а затем искать его ссылки (многие из которых недоступны в Интернете и, к сожалению, могут быть трудно найти даже при доступе к университетской библиотеке).

Zwol
источник
1
Итак, ASCII сегодня 7-битный или 8-битный? Вы говорите, что сейчас он использует 0x00-0x7F, очевидно. Но считаем ли мы ведущий 0?
Анураг Калия
8
Это зависит от того, какой вы педант. Спецификация, которая до сих пор официально определяет ASCII (ANSI X3.4-1968), описывает его как 7-битную кодировку, но никто больше не передает 7-битные байты, и совместимость в настоящее время диктует, что восьмой бит должен быть нулевым - вы не можете используйте его для бита четности или подобного. Таким образом, IMNSHO также может описывать ASCII как восьмибитную кодировку, которая оставляет верхнюю половину своего числового пространства как «зарезервировано, не использовать». В любом случае, если вы передаете восьмибитные байты, для любого из которых установлен высокий бит, вы не передаете действительный ASCII.
zwol 04
1
(... но вы могли бы передавать действительное что-то еще, например, UTF-8 или ISO 8859-1 или KOI8-R.)
zwol
1
Чтобы быть действительно педантичным, стандартом теперь является INCITS 4-1986 [R2012], потому что ASC ранее назывался X3, превратился в NCITS, а затем в INCITS. Но 7-битные варианты с примерно дюжиной букв с диакритическими знаками для французского, немецкого, испанского и т. Д. Не являются чем-то ANSI / INCITS, а скорее ISO / IEC 646 и ECMA-6. И именно 8-битный (ISO / IEC) 8859-1 образует первый 256-символьный блок Unicode.
dave_thompson_085
2
@ dave_thompson_085 Не все так педантичны, как вы - это означает, что вы можете найти старую техническую документацию и даже стандарты, в которых упоминается «ASCII» или даже «X3.4-1968», намереваясь включить национальные варианты, или, по крайней мере, явно не исключаю, что приводит к спорам. Поэтому я лично использовал бы Unicode в качестве нормативного справочника для ASCII, если бы мне пришлось написать спецификацию там, где это важно. Это все, что я имел в виду.
zwol
15

В Linux man asciiговорит:

ASCII - это американский стандартный код для обмена информацией. Это 7-битный код.

BeniBela
источник
10

Исходная таблица ASCII кодируется на 7 бит поэтому имеет 128 символов.

В настоящее время большинство читателей / редакторов используют «расширенную» таблицу ASCII (из ISO 8859-1 ), которая закодирована на 8 бит и содержит 256 символов (включая Á , Ä , Œ , é , è и другие символы, также полезные для европейских языков. как математические глифы и другие символы).

В то время как UTF-8 использует ту же кодировку в качестве основной таблицы ASCII (значение 0x41является в обоих кодов), он не разделяет ту же кодировку для блока «Расширенная латиница-A». Иногда в таких словах, как à la carte или piñata, появляются странные символы .

Гийом
источник
В вышеизложенном есть несколько ошибок. Œ не является частью ISO 8859-1, хотя входит в CP-1252 . И блок Latin Extended-A - это не первые 128 или 256 символов Unicode: это следующий блок после них, содержащий такие буквы, как, ł и ſ.
Ричард Смит
Хорошая точка зрения! Думаю, я имел в виду «Дополнение Latin-1». Стандарты стандарты ...
Гийом
1
Существует множество наборов символов «Extended ASCII», и только один из них - ISO 8859-1. Этот термин почти бессмысленен, потому что при кодировании и декодировании текста вы должны знать, какая конкретная кодировка символов используется (и это может быть даже не для расширенного набора символов ASCII).
Tom Blodget
2

Кодировка ASCII 7-битная, но на практике символы, закодированные в ASCII, не хранятся в группах по 7 бит. Вместо этого один ASCII хранится в байте, при этом MSB обычно устанавливается в 0 (да, он теряется в ASCII).

Вы можете проверить это, введя строку в наборе символов ASCII в текстовом редакторе, установив кодировку ASCII и просмотрев двоичное / шестнадцатеричное:
введите описание изображения здесь

Кроме того: использование (строго) кодировки ASCII сейчас необычно, в пользу UTF-8 (который не тратит впустую упомянутый выше MSB - фактически, MSB, равный 1, указывает, что кодовая точка закодирована более чем 1 байтом).

flow2k
источник
0

Исходный код ASCII содержал 128 различных символов, пронумерованных от 0 до 127. ASCII и 7-битный байт являются синонимами, поскольку 8-битный байт является общим элементом хранения, ASCII оставляет место для 128 дополнительных символов, которые используются для иностранных языков и других символов. Но 7-битный код был изначально создан до 8-битного кода. ASCII - американский стандартный код для обмена информацией. В ранних системах электронной почты он поддерживал только 7-битные коды ASCII, потому что тогда он мог выполнять программы и мультимедийные файлы через отстойные системы. Эти системы используют 8 бит байта, но затем его необходимо преобразовать в 7-битный формат, используя такие методы кодирования, как MIME, UUcoding и BinHex. Это означает, что 8-битные символы были преобразованы в 7-битные символы, что добавляет дополнительные байты для их кодирования.

Brookey
источник
-4

когда мы называем ASCII 7-битным кодом, самый левый бит используется как знаковый бит, поэтому с 7 битами мы можем записать до 127. Это означает от -126 до 127, потому что максимальное значение имама ASCII составляет от 0 до 255. это может быть удовлетворяется аргументом 7 бит, только если последний бит считается битом знака

аджу
источник
Как у персонажа может быть знак?
Олег Мисарош