Чи є код ASCII 7-бітним чи 8-розрядним?


100

Мій вчитель сказав мені, що ASCII - це 8-бітова схема кодування символів. Але він визначений лише для 0-127 кодів, що означає, що його можна помістити в 7-біт. Тож чи не можна стверджувати, що біт ASCII насправді є 7-бітовим кодом?

І що ми взагалі маємо сказати, кажучи, що ASCII - це взагалі 8-розрядний код?

Відповіді:


91

ASCII справді спочатку був задуманий як 7-бітний код. Це було зроблено задовго до того, як 8-бітні байти стали всюдисущими, і навіть у 90-ті роки ви могли знайти програмне забезпечення, яке передбачало, що воно може використовувати 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), оскільки історично в репертуарі ASCII 127 символів було декілька десятків варіантів - наприклад, деякі з них розділові знаки можуть бути замінені наголошеними літерами для полегшення передачі французького тексту. Сьогодні всі ці варіації застаріли, і коли люди кажуть "ASCII", вони означають, що байти зі значенням 0x00 до 0x7F кодують кодові точки Unicode U + 0000 до U + 007F. Це, ймовірно, має значення для вас, якщо ви коли-небудь опинитесь, що пишете технічний стандарт.

Якщо вас цікавить історія ASCII та попередні кодування, почніть із статті "Еволюція кодів символів, 1874-1968" (копія самвидаву за адресою http://falsedoor.com/doc/ascii_evolution-of- character-codes.pdf ), а потім переслідувати його посилання (багато з яких недоступні в Інтернеті, і їх важко знайти навіть при доступі до університетської бібліотеки, я з жалем кажу).


1
Тож ASCII сьогодні є 7-бітовим чи 8-бітним? Ви кажете, що зараз використовується 0x00-0x7F, очевидно. Але чи вважаємо ми провідні 0?
Anurag Kalia

8
Це залежить від того, який ти педант. Специфікація, яка все ще офіційно визначає ASCII (ANSI X3.4-1968), описує це як 7-бітове кодування, але більше ніхто не передає 7-бітові байти, а сумісність сьогодні наказує, що восьмий біт повинен бути нульовим - ви не можете використовувати його для паритету біт або подібного. Отже, IMNSHO однаково справедливо описувати ASCII як восьмибітове кодування, яке, як правило, залишає верхню половину його простору чисел як "зарезервоване, не використовувати". У будь-якому випадку, якщо ви передаєте восьмибітні байти, будь-який з яких має свій високий біт, ви не передаєте дійсний ASCII.
zwol

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

14

Про Linux man asciiкажуть:

ASCII - це американський стандартний кодекс обміну інформацією. Це 7-бітний код.


9

Оригінальна таблиця ASCII кодується на 7 біт, тому вона містить 128 символів.

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

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


У наведеному вище є кілька помилок. Œ не є частиною ISO 8859-1, хоча є в CP-1252 . А латинський блок Extended-A - це не перші 128 або 256 символів Unicode: це наступний блок після того, як вони містять літери на зразок ğ, ł та ſ.
Річард Сміт

Гарна думка! Думаю, я мав на увазі "Додаток до латиниці-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 байт).


0

Оригінальний код ASCII містив 128 різних символів, що пронумеровані від 0 до 127. 7-бітний ASCII є синонімом, оскільки 8-бітний байт є загальним елементом зберігання, ASCII залишає місце для 128 додаткових символів, які використовуються для іноземних мов та інших символів. Але 7-бітний код був оригінальним, зробленим перед 8-бітовим кодом. ASCII - американський стандартний код для обміну інформацією. У ранніх поштових системах Інтернету він підтримував лише 7-бітні ASCII-коди. Це було тому, що потім він міг виконувати програми та мультимедійні файли через відсмоктуючі системи. Ці системи використовують 8 біт байта, але потім їх потрібно перетворити на 7-бітний формат, використовуючи методи кодування, такі як MIME, UUcoding та BinHex. Це означає, що 8-бітний перетворений у 7-бітові символи, що додає зайві байти для їх кодування.


-3

коли ми називаємо ASCII 7-бітовим кодом, найбільше лівий біт використовується як біт знаків, тому за допомогою 7 біт ми можемо записувати до 127. Це означає від -126 до 127, тому що значення максимального імама ASCII від 0 до 255. Це може бути задоволений аргументом 7 біт, якщо останній біт вважається бітом знаків


Як персонаж може мати знак?
Олег Місарош
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.