ASCII kodu 7 bit mi yoksa 8 bit mi?


104

Öğretmenim bana ASCII'nin 8 bitlik karakter kodlama şeması olduğunu söyledi. Ancak sadece 0-127 kodlar için tanımlanmıştır, yani 7-bit'e sığabilir. O halde ASCII bitinin aslında 7 bitlik kod olduğu tartışılamaz mı?

Ve ASCII'nin 8 bitlik kod olduğunu söylerken ne demek istiyoruz?

Yanıtlar:


96

ASCII aslında aslında 7 bitlik bir kod olarak düşünülmüştür. Bu, 8 bitlik baytların her yerde bulunmasından çok önce yapıldı ve hatta 1990'larda bile, her bir metnin 8. bitini kendi amaçları için kullanabileceğini varsayan yazılımlar bulabiliyordunuz ("8 bitlik temiz değil"). Günümüzde insanlar bunu , 0x80'den 0xFF'ye kadar olan baytların tanımlanmış bir anlamı olmayan 8 bitlik bir kodlama olarak düşünüyor , ancak bu bir retcon .

8. biti kullanan düzinelerce metin kodlaması vardır; ASCII uyumlu veya değil ve sabit veya değişken genişlikli olarak sınıflandırılabilirler. ASCII uyumlu , bağlamdan bağımsız olarak , 0x00 ile 0x7F arasındaki değerlere sahip tek baytların ASCII'de olacakları aynı karakterleri kodladığı anlamına gelir . Kaçınabiliyorsanız, ASCII uyumlu olmayan bir metin kodlamayla hiçbir ilginiz olmasını istemezsiniz; ASCII bekleyen saf programlar, onları felaketle yanlış yorumlama eğilimindedir, genellikle güvenliği bozar. Bugünlerde o kadar kullanımdan kaldırıldılar ki (örneğin) HTML5, UTF-16'nın talihsiz istisnası dışında, genel Web'de kullanımlarını yasaklıyor . Artık onlar hakkında konuşmayacağım.

Sabit genişlikli kodlama, kulağa nasıl geldiği anlamına gelir: tüm karakterler aynı sayıda bayt kullanılarak kodlanır. ASCII uyumlu olması için, bir sabit kodlamanın tüm karakterlerini yalnızca bir bayt kullanarak kodlaması gerekir, böylece 256 karakterden fazla olamaz. Günümüzde en yaygın bu tür kodlama , ISO 8859-1'in bir uzantısı olan Windows- 1252'dir .

Bugünlerde bilinmeye değer tek bir değişken genişlikli ASCII uyumlu kodlama var, ancak çok önemli: Tüm Unicode'u ASCII uyumlu bir kodlamada paketleyen UTF-8 . Yönetebiliyorsanız bunu gerçekten kullanmak istiyorsunuz.

Son bir not olarak, "ASCII" bugünlerde pratik tanımını orijinal standardından (ANSI X3.4-1968) değil, Unicode'dan alıyor , çünkü tarihsel olarak ASCII 127 karakter repertuarında birkaç düzine varyasyon vardı - örneğin, bazıları Fransızca metnin iletimini kolaylaştırmak için noktalama işaretleri aksanlı harflerle değiştirilebilir. Günümüzde tüm bu varyasyonlar eskidir ve insanlar "ASCII" dediklerinde, 0x00 ile 0x7F arasındaki değerlere sahip baytların U + 0000 ile U + 007F arasındaki Unicode kod noktalarını kodladığı anlamına gelir. Bu muhtemelen sadece, kendinizi teknik bir standart yazarken bulursanız, sizin için önemli olacaktır.

ASCII'nin geçmişi ve ondan önceki kodlamalarla ilgileniyorsanız, "The Evolution of Character Codes, 1874-1968" (samizdat kopyası http://falsedoor.com/doc/ascii_evolution-of- adresinde) ile başlayın. karakter-kodları.pdf ) ve sonra referanslarını takip edin (bunların çoğu çevrimiçi olarak mevcut değildir ve bir üniversite kütüphanesine erişimle bile bulmak zor olabilir, üzgünüm).


1
ASCII bugünlerde 7-bit mi yoksa 8-bit mi? Açıkçası, şimdi 0x00-0x7F kullandığını söylüyorsunuz. Ama baştaki 0'ı sayıyor muyuz?
Anurag Kalia

8
Bu ne tür bir bilgiç olduğunuza bağlı. Hala resmi olarak ASCII'yi (ANSI X3.4-1968) tanımlayan spesifikasyon, bunu 7 bitlik bir kodlama olarak tanımlıyor, ancak artık kimse 7 bitlik bayt iletmiyor ve günümüzde birlikte çalışabilirlik, sekizinci bitin sıfır olması gerektiğini söylüyor - yapamazsınız bir eşlik biti veya benzeri için kullanın. Dolayısıyla, IMNSHO'nun ASCII'yi sayı alanının üst yarısını "ayrılmış, kullanmayın" olarak bırakan sekiz bitlik bir kodlama olarak tanımlamak da aynı derecede geçerlidir. Her iki yolda da iletmek eğer sekiz bitlik sen edilir, bunlardan herhangi biri onların yüksek bit kümesi bayt değil geçerli ASCII iletilmesi.
zwol

1
(... ancak geçerli bir şey iletiyor olabilirsiniz - UTF-8 veya ISO 8859-1 veya KOI8-R gibi.)
zwol

1
Gerçekten bilgiçlikçi olmak gerekirse, standart şimdi INCITS 4-1986 [R2012] 'dir, çünkü daha önce X3 olarak bilinen ASC , NCITS'e sonra INCITS'e mutasyona uğradı. Ancak Fransızca, Almanca, İspanyolca vb. İçin yaklaşık bir düzine aksanlı harf içeren 7 bitlik varyantlar ANSI / INCITS değildir, ISO / IEC 646 ve ECMA-6'dan çok. Ve Unicode'un ilk 256 karakterlik bloğunu oluşturan 8 bitlik (ISO / IEC) 8859-1'dir.
dave_thompson_085

2
@ dave_thompson_085 Herkes sizin kadar bilgiçlik taslamaz - bu, eski teknik dokümantasyonu ve hatta ulusal varyantları dahil etmeyi amaçlayan "ASCII" veya hatta "X3.4-1968" referanslı standartları bulabileceğiniz anlamına gelir. açıkça dışlamıyor, tartışmalara yol açıyor. Bu nedenle, önemli bir yerde bir şartname yazmak zorunda olsaydım, kişisel olarak Unicode'u ASCII için normatif referans olarak kullanırdım. Tüm kastettiğim bu.
zwol

15

Linux'ta man asciidiyor ki:

ASCII, Bilgi Değişimi için Amerikan Standart Kodudur. 7 bitlik bir koddur.


10

Orijinal ASCII tablosu 7 bit olarak kodlanmıştır, bu nedenle 128 karaktere sahiptir.

Günümüzde çoğu okuyucu / editör , 8 bitte kodlanmış ve 256 karaktere sahip ( Á , Ä , Œ , é , è ve Avrupa dilleri için de yararlı olan diğer karakterler dahil ) "genişletilmiş" bir ASCII tablosu ( ISO 8859-1'den ) kullanmaktadır. matematiksel glifler ve diğer semboller olarak).

Temel ASCII tablosu olarak UTF-8 kullanır aynı kodlama (anlam iken 0x41olan bir Her iki kodları), bu "Latince Genişletilmiş-A" blok için aynı kodlamayı paylaşmaz. Bu bazen alakart veya piñata gibi kelimelerde garip karakterlerin görünmesine neden olur .


Yukarıda birkaç hata var. Œ, CP-1252'de olmasına rağmen ISO 8859-1'in bir parçası değildir . Ve Latin Extended-A bloğu Unicode'un ilk 128 veya 256 karakteri değildir: ğ, ł ve ſ gibi harflerden sonra gelen bir sonraki bloktur.
Richard Smith

İyi bir nokta! Sanırım "Latin-1 Ek" demek istedim. Standartlar standartları ...
Guillaume

1
Birçok "Genişletilmiş ASCII" karakter kümesi vardır ve bunlardan yalnızca biri ISO 8859-1'dir. Terim neredeyse anlamsızdır çünkü metni kodlarken ve kodunu çözerken hangi özel karakter kodlamasının kullanıldığını bilmeniz gerekir (ve Genişletilmiş ASCII karakter kümesi için bile olmayabilir).
Tom Blodget

3

ASCII kodlaması 7 bittir, ancak pratikte ASCII'de kodlanan karakterler 7 bitlik gruplar halinde depolanmaz. Bunun yerine, MSB genellikle 0'a ayarlanmış olarak bir ASCII bir baytta saklanır (evet, ASCII'de boşa harcanır).

Bir metin düzenleyicide ASCII karakter kümesine bir dize girerek, kodlamayı ASCII olarak ayarlayarak ve ikili / onaltılı görüntüleyerek bunu doğrulayabilirsiniz:
görüntü açıklamasını buraya girin

Kenara: (kesinlikle) ASCII kodlama kullanımı (yok UTF-8 lehine, şimdi nadirdir değil - aslında, 1 bir MSB kod noktası 1'den fazla bayt ile kodlanmış belirten MSB yukarıda belirtilen atık).


0

Orijinal ASCII kodu, 0 ila 127 arasında numaralandırılmış 128 farklı karakter sağladı. 7 bitlik ASCII eş anlamlıdır, çünkü 8 bitlik bayt ortak depolama öğesi olduğundan ASCII, yabancı diller ve diğer semboller için kullanılan 128 ek karakter için yer bırakır. Ancak 7 bitlik kod, 8 bitlik koddan önce orijinal yapıldı. ASCII, Bilgi Alışverişi için Amerikan Standart Kodu anlamına gelir. Eski internet posta sistemlerinde, yalnızca 7 bitlik ASCII kodlarını desteklediğinden, bunun nedeni, emici sistemler üzerinden programları ve multimedya dosyalarını çalıştırabilmesiydi. Bu sistemler 8 bit bayt kullanır ancak daha sonra MIME, UUcoding ve BinHex gibi kodlama yöntemleri kullanılarak 7 bitlik bir biçime dönüştürülmelidir. Bu, 8 bitin 7 bitlik karakterlere dönüştürüldüğü anlamına gelir, bu da onları kodlamak için fazladan bayt ekler.


-4

ASCII'yi 7 bitlik kod olarak çağırdığımızda, en soldaki bit işaret biti olarak kullanılır, dolayısıyla 7 bit ile 127'ye kadar yazabiliriz. Bu, -126'dan 127'ye anlamına gelir çünkü ASCII'nin Maks imam değeri 0 ila 255'tir. sadece son bit işaret biti olarak kabul edilirse 7 bit argümanından memnun


Bir karakter nasıl bir işarete sahip olabilir?
Oleh Misarosh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.