Czy kod ASCII jest 7-bitowy czy 8-bitowy?

100

Mój nauczyciel powiedział mi, że ASCII to 8-bitowy schemat kodowania znaków. Ale jest zdefiniowany tylko dla kodów 0-127, co oznacza, że ​​może być dopasowany do 7-bitowych. Czy więc nie można argumentować, że bit ASCII jest w rzeczywistości kodem 7-bitowym?

A co w ogóle mamy na myśli, mówiąc, że ASCII jest w ogóle kodem 8-bitowym?

Anurag Kalia
źródło

Odpowiedzi:

91

ASCII był rzeczywiście pierwotnie pomyślany jako kod 7-bitowy. Zrobiono to na długo zanim 8-bitowe bajty stały się wszechobecne, a nawet w latach 90. można było znaleźć oprogramowanie, które zakładało, że może używać 8. bitu każdego bajtu tekstu do własnych celów („nie czyste 8-bitowe”). W dzisiejszych czasach ludzie myślą o tym jako o 8-bitowym kodowaniu, w którym bajty od 0x80 do 0xFF nie mają zdefiniowanego znaczenia, ale to jest retcon .

Istnieją dziesiątki kodowań tekstu korzystających z ósmego bitu; można je sklasyfikować jako zgodne lub niekompatybilne z ASCII oraz o stałej lub zmiennej szerokości. Zgodność z ASCII oznacza, że niezależnie od kontekstu pojedyncze bajty o wartościach od 0x00 do 0x7F kodują te same znaki, które byłyby w ASCII. Nie chcesz mieć nic wspólnego z kodowaniem tekstu niezgodnym z ASCII, jeśli możesz tego uniknąć; naiwne programy oczekujące ASCII mają tendencję do błędnej interpretacji ich w katastrofalny, często łamiący zabezpieczenia sposób. Obecnie są tak przestarzałe, że (na przykład) HTML5 zabrania ich używania w sieci publicznej, z niefortunnym wyjątkiem UTF-16 . Nie będę więcej o nich mówić.

Kodowanie o stałej szerokości oznacza, jak to brzmi: wszystkie znaki są kodowane przy użyciu tej samej liczby bajtów. Aby było zgodne z ASCII, kodowanie ze stałym ustawieniem musi kodować wszystkie swoje znaki przy użyciu tylko jednego bajtu, więc nie może mieć więcej niż 256 znaków. Najpopularniejszym obecnie takim kodowaniem jest Windows-1252 , rozszerzenie ISO 8859-1 .

Obecnie jest tylko jedno kodowanie zgodne z ASCII o zmiennej szerokości, o którym warto wiedzieć, ale jest to bardzo ważne: UTF-8 , które pakuje cały kod Unicode do kodowania zgodnego z ASCII. Naprawdę chcesz tego używać, jeśli możesz nim zarządzać.

Na koniec, "ASCII" obecnie bierze swoją praktyczną definicję z Unicode, a nie z oryginalnego standardu (ANSI X3.4-1968), ponieważ historycznie istniało kilkadziesiąt odmian repertuaru ASCII 127-znakowego - na przykład niektóre z interpunkcję można zastąpić literami akcentowanymi, aby ułatwić przesyłanie tekstu francuskiego. Obecnie wszystkie te odmiany są przestarzałe, a kiedy ludzie mówią „ASCII”, mają na myśli to, że bajty o wartości od 0x00 do 0x7F kodują punkty kodowe Unicode od U + 0000 do U + 007F. Prawdopodobnie będzie to miało dla Ciebie znaczenie tylko wtedy, gdy kiedykolwiek napiszesz normę techniczną.

Jeśli interesuje Cię historia ASCII i poprzedzające ją kodowania, zacznij od artykułu „The Evolution of Character Codes, 1874-1968” (kopia samizdat dostępna pod adresem http://falsedoor.com/doc/ascii_evolution-of- character-cod.pdf ), a następnie gonić za jego referencjami (z których wiele nie jest dostępnych w Internecie i może być trudnych do znalezienia nawet przy dostępie do biblioteki uniwersyteckiej, przykro mi to mówić).

zwol
źródło
1
Czy ASCII jest obecnie 7-bitowy czy 8-bitowy? Mówisz, że teraz oczywiście używa 0x00-0x7F. Ale czy liczymy wiodące 0?
Anurag Kalia
8
To zależy od tego, jakim jesteś pedantem. Specyfikacja, która nadal oficjalnie definiuje ASCII (ANSI X3.4-1968) opisuje go jako 7-bitowe kodowanie, ale nikt już nie przesyła 7-bitowych bajtów, a współdziałanie mówi, że ósmy bit musi mieć wartość zero - nie można użyj go jako bit parzystości lub podobny. Tak więc równie poprawnym IMNSHO jest opisanie ASCII jako ośmiobitowego kodowania, w którym górna połowa jego przestrzeni liczbowej jest określana jako „zarezerwowane, nie używaj”. Tak czy inaczej, jeśli przesyłasz ośmiobitowe bajty, z których każdy ma ustawiony wysoki bit, nie przesyłasz prawidłowego ASCII.
zwol
1
(... ale możesz przesyłać prawidłowe coś innego, na przykład UTF-8, ISO 8859-1 lub KOI8-R.)
zwolnij
1
Aby być naprawdę pedantycznym, standardem jest teraz INCITS 4-1986 [R2012], ponieważ ASC poprzednio znany jako X3 zmutował do NCITS, a następnie INCITS. Ale 7-bitowe warianty z kilkunastoma akcentowanymi literami dla francuskiego, niemieckiego, hiszpańskiego itp. Nie są niczym ANSI / INCITS, a raczej ISO / IEC 646 i ECMA-6. I to 8-bitowy (ISO / IEC) 8859-1, który tworzy pierwszy 256-znakowy blok Unicode.
dave_thompson_085,
2
@ dave_thompson_085 Nie każdy jest tak pedantyczny jak ty - co oznacza, że ​​możesz znaleźć starszą dokumentację techniczną, a nawet normy, które odwołują się do „ASCII”, a nawet „X3.4-1968”, z zamiarem uwzględnienia wariantów krajowych, lub przynajmniej nie wykluczając tego wyraźnie, co prowadzi do kłótni. Dlatego osobiście użyłbym Unicode jako odniesienia normatywnego dla ASCII, gdybym musiał napisać specyfikację, w której ma to znaczenie. To wszystko, co miałem na myśli.
zwol
14

W systemie Linux man asciimówi:

ASCII to amerykański standardowy kod wymiany informacji. Jest to kod 7-bitowy.

BeniBela
źródło
9

Oryginalna tablica ASCII jest zakodowana na 7 bitach, więc ma 128 znaków.

Obecnie większość czytelników / redaktorów używa "rozszerzonej" tabeli ASCII (z ISO 8859-1 ), która jest zakodowana na 8 bitach i ma 256 znaków (w tym Á , Ę , Œ , é , è i inne znaki przydatne również w językach europejskich jako glify matematyczne i inne symbole).

Chociaż UTF-8 używa tego samego kodowania, co podstawowa tabela ASCII (co 0x41oznacza, że w obu kodach jest A ), nie ma tego samego kodowania dla bloku „Latin Extended-A”. Co czasami powoduje, że dziwne postacie pojawiają się w słowach takich jak à la carte lub piñata .

Guillaume
źródło
W powyższym jest kilka błędów. Œ nie jest częścią ISO 8859-1, chociaż znajduje się w CP-1252 . A Rozszerzony łaciński-A blok nie jest pierwsze 128 lub 256 znaków Unicode: jest następny blok po nich zawiera litery jak G, L i S.
Richard Smith
Słuszna uwaga! Myślę, że miałem na myśli „Dodatek Latin-1”. Standardy standardów ...
Guillaume
1
Istnieje wiele zestawów znaków „Extended ASCII”, a tylko jeden z nich to ISO 8859-1. Termin jest prawie bez znaczenia, ponieważ podczas kodowania i dekodowania tekstu musisz wiedzieć, które kodowanie znaków jest używane (i może nie dotyczyć nawet zestawu znaków rozszerzonego ASCII).
Tom Blodget,
2

Kodowanie ASCII jest 7-bitowe, ale w praktyce znaki zakodowane w ASCII nie są przechowywane w grupach po 7 bitów. Zamiast tego jeden ASCII jest przechowywany w bajcie, z MSB zwykle ustawionym na 0 (tak, jest marnowany w ASCII).

Możesz to sprawdzić, wprowadzając ciąg w zestawie znaków ASCII w edytorze tekstu, ustawiając kodowanie na ASCII i przeglądając binarny / szesnastkowy:
wprowadź opis obrazu tutaj

Poza tym: stosowanie (ściśle) kodowania ASCII jest teraz rzadkością na korzyść UTF-8 (co nie marnuje wspomnianego powyżej MSB - w rzeczywistości MSB 1 wskazuje, że punkt kodowy jest kodowany z więcej niż 1 bajtem).

flow2k
źródło
0

Oryginalny kod ASCII zawierał 128 różnych znaków ponumerowanych od 0 do 127. ASCII a 7-bitowe są synonimami, ponieważ 8-bitowy bajt jest wspólnym elementem pamięci, ASCII pozostawia miejsce na 128 dodatkowych znaków, które są używane dla języków obcych i innych symboli. Ale kod 7-bitowy został pierwotnie utworzony przed kodem 8-bitowym. ASCII to skrót od American Standard Code for Information Interchange We wczesnych systemach poczty internetowej obsługiwał tylko 7-bitowe kody ASCII, ponieważ mógł wówczas wykonywać programy i pliki multimedialne za pośrednictwem systemów ssących. Systemy te używają 8 bitów bajtu, ale następnie należy go przekształcić w format 7-bitowy przy użyciu metod kodowania, takich jak MIME, UUcoding i BinHex. Oznacza to, że 8-bitowy został przekonwertowany na 7-bitowe znaki, co dodaje dodatkowe bajty do ich zakodowania.

brookey
źródło
-3

kiedy nazywamy ASCII jako kod 7-bitowy, lewy najbardziej lewy bit jest używany jako bit znaku, więc przy 7 bitach możemy zapisać do 127. oznacza to od -126 do 127, ponieważ wartość Max imam ASCII wynosi od 0 do 255. może to być zadowalający tylko argument 7-bitowy, jeśli ostatni bit jest uważany za bit znaku

aju
źródło
Jak postać może mieć znak?
Oleh Misarosh