ASCII ve Unicode arasındaki fark nedir?


Yanıtlar:


534

ASCII, 0–127 sayılarıyla eşleşen 128 karakter tanımlar. Unicode tanımlar 2 (az) 21 , benzer şekilde, sayılar 0-2 eşleme karakterleri, 21 (gerçi bütün numaralar şu anda atanır değil ve bazı saklıdır).

Unicode, ASCII'nin bir üst kümesidir ve 0–127 sayıları, ASCII'de Unicode'dakilerle aynı anlama sahiptir. Örneğin, 65 sayısı "Latin başkenti" A "anlamına gelir.

Unicode karakterler genellikle bir 8 bit bayta sığmadığından, Unicode karakterleri UTF-32 ve UTF-8 gibi bayt dizilerine depolamanın çeşitli yolları vardır.


4
@riderBill: Şimdi ne olacak? Hangi 3 bitten bahsediyorsun? Unicode'da bit yok. Sadece kod noktaları.
Kerrek SB

@riderBill: tekrar: şu an hangi "3 byte" dan bahsediyorsunuz? :-) (Bunların hiçbirinin Unicode ile ilgisi yoktur. Unicode yalnızca sayılara anlam atamakla ilgilidir, bitler ve
baytlarla

8
@riderBill: Unicode yapar değil "1 ve 4 bayt arasında kullanımı". Unicode, sayılara anlam atamasıdır. Herhangi bir bayt kullanmaz. Unicode kod noktalarını bir bayt akışı olarak temsil etmek için belirli standartlaştırılmış kodlama şemaları vardır, ancak karakter kümesi olarak Unicode'a diktirler. (Evet, istediğiniz gibi
silmekten çekinmeyin

@CleanCrispCode Unicode, aslında kendisi ASCII'nin bir üst kümesi olan ISO- 8859-1'in bir üst kümesidir. Bazen bunu bilmek faydalıdır.
Mark Ransom

8
Netleştirmek için, Unicode karakter kümesi kendisini ISO-8859-1 bir üst kümesidir karakter kümesi , ancak UTF-8 kodlama olduğu değil ISO-8859-1 bir üst kodlaması ama ASCII kodlaması .
minmaxavg

392

Anlama neden ASCII ve Unicode ilk etapta oluşturulan bana ikisi arasındaki farkları anlamak yardımcı oldu.

ASCII, Kökenleri

Diğer cevaplarda belirtildiği gibi, ASCII bir karakteri temsil etmek için 7 bit kullanır. 7 bit kullanarak maksimum 2 ^ 7 (= 128) farklı kombinasyona * sahip olabiliriz . Bu, maksimum 128 karakteri temsil edebileceğimiz anlamına gelir.

Bekle, 7 bit mi? Ama neden 1 bayt (8 bit) olmasın?

Son bit (8.), eşlik biti olarak hatalardan kaçınmak için kullanılır . Bu yıllar önce geçerliydi.

Çoğu ASCII karakterleri,? & !, böyle abc ABC, 123 olarak alfabenin yazdırılabilir karakterler vb diğerleri kontrol karakterleri gibi satırbaşı, satır besleme vb sekmesi,

ASCII'de birkaç karakterin ikili sunumuna bakın:

0100101 -> % (Percent Sign - 37)
1000001 -> A (Capital letter A - 65)
1000010 -> B (Capital letter B - 66)
1000011 -> C (Capital letter C - 67)
0001101 -> Carriage Return (13)

ASCII tablosunun tamamını buradan görebilirsiniz .

ASCII sadece İngilizce içindir.

Ne? Neden sadece İngilizce? Orada birçok dil var!

Çünkü bilgisayar endüstrisinin merkezi o sırada ABD'deydi. Sonuç olarak, onlar destek aksan veya A, U, C, N, vb (aka gibi diğer işaretlere gerek yoktu aksan ).

ASCII Genişletilmiş

Bazı akıllı insanlar dillerini desteklemek için daha fazla karakter kodlamak (örneğin Fransızca'da "é" yi desteklemek için) 8. biti (parite için kullanılan bit) kullanmaya başladı. Sadece bir ekstra bit kullanarak, orijinal ASCII tablosunun boyutunu iki katına çıkararak 256 karaktere kadar eşleştirin (2 ^ 8 = 256 karakter). Ve daha önce olduğu gibi 2 ^ 7 değil (128).

10000010 -> é (e with acute accent - 130)
10100000 -> á (a with acute accent - 160)

Bu "ASCII'nin adı daha önce olduğu gibi 7 bite değil, 8 bite kadar genişletildi" sadece "genişletilmiş ASCII" veya "8 bit ASCII" olarak adlandırılabilir.

As @Tom onun yorumunda işaret var "diye bir şey aşağıda genişletilmiş ASCII " Henüz bu bu 8 bitlik hile başvurmak için kolay bir yoldur. 8 bitlik ASCII tablosunun birçok varyasyonu vardır, örneğin ISO Latin-1 olarak da adlandırılan ISO 8859-1 .

Unicode, Yükseliş

ASCII Extended, Latin alfabesine dayanan diller için sorunu çözüyor ... Peki ya tamamen farklı bir alfabeye ihtiyaç duyan diğerleri? Yunan? Rusça? Çinliler ve benzerleri?

Tamamen yeni bir karakter setine ihtiyacımız olurdu ... Bu Unicode'un arkasındaki rasyoneldi. Unicode her dilden her karakteri içermez, ancak çok büyük miktarda karakter içerdiğinden emin olun ( bu tabloya bakın ).

Sabit sürücünüze "Unicode" olarak metin kaydedemezsiniz. Unicode metnin soyut bir temsilidir. Bu soyut temsili "kodlamanız" gerekir. İşte burada kodlama devreye giriyor.

Kodlamalar: UTF-8'e karşı UTF-16'a karşı UTF-32

Bu cevap temelleri açıklamada oldukça iyi bir iş çıkarıyor:

  • UTF-8 ve UTF-16 değişken uzunluklu kodlamalardır.
  • UTF-8'de, bir karakter en az 8 bit içerebilir.
  • UTF-16'da karakter uzunluğu 16 bit ile başlar.
  • UTF-32, 32 bitlik sabit uzunluklu bir kodlamadır.

UTF-8, ilk 128 karakter için ASCII setini kullanır. Bu kullanışlı çünkü ASCII metninin UTF-8'de de geçerli olduğu anlamına geliyor.

Mnemonics:

  • UTF- 8 : minimum 8 bit.
  • UTF- 16 : minimum 16 bit.
  • UTF- 32 : minimum ve maksimum 32 bit.

Not:

Neden 2 ^ 7?

Bu bazıları için açıktır, ancak her ihtimale karşı. 0 veya 1 ( İkili Kod ) ile dolu yedi yuvamız var . Her birinin iki kombinasyonu olabilir. Yedi noktamız varsa, 2 * 2 * 2 * 2 * 2 * 2 * 2 = 2 ^ 7 = 128 kombinasyonumuz var. Bunu yedi tekerlekli bir kombinasyon kilidi olarak düşünün, her tekerlekte sadece iki sayı var.

Kaynak: Wikipedia , bu harika blog yazısı ve başlangıçta bu özeti gönderdiğim Mocki .


7
Metin yok ama kodlanmış metin var. Bazı kodlamalar çok basittir, özellikle <= 256 kod noktalı karakter kümeleri için. "Genişletilmiş ASCII" çok belirsiz bir terimdir; Yunanca, Rusça ve / veya Lehçe destekleyen bazı kişiler var. ASCII, á, ü, ç, ñ kullanan İngilizce metinler için yetersizdir. İnsan dilleri yerine bilgisayar dillerini desteklemek üzere tasarlandığından şüpheleniyorum. Dogmatik olarak, bir dosya veya akış yazdığınızda, bir karakter setiniz var ve bir kodlama seçiyorsunuz. Okuyucunuz hangi kodlamanın bayt ve bilgisini almalıdır. Aksi takdirde iletişim başarısız oldu.
Tom Blodget

Zeyilname için çok teşekkür ederim. Cevabı buna göre güncelledim.
Andrew

Teşekkür ederim. Her yerde ASCII tabloları karakter kodları 0-127 olarak gösterir, ancak UTF-8 tabloları kodları tamsayı değil onaltılık olarak gösterir. Bunun bir sebebi var mı? UTF-X tabloları neden 00-AF'ye karşı 0-127 / 255/65535 göstermiyor? Bu bir şey ifade ediyor mu?
wayofthefuture

Cevabınız için teşekkür ederim. Kısa soru: 'UTF-16'da karakter uzunluğu 16 bit ile başlar' - Bu, alfasayısal karakterlerin UTF-16 ile temsil edilemeyeceği anlamına mı gelir, çünkü sadece 8 bit karakterdir?
Moondra

Harika cevap, sadece bir sorunum var - Lehçe gerçekten farklı bir alfabe kullanıyor mu? İngilizce ile aynı olanı kullandığımızı sanıyordum, sadece ek harflerle mi?
Nicofisi

89

ASCII, 0 ila 127 arasında 128 kod noktasına sahiptir. Tek bir 8 bit bayta sığabilir, 128 ila 255 değerleri diğer karakterler için kullanılma eğilimindedir. Uyumsuz seçimlerle kod sayfası felaketine neden olur . Bir kod sayfasında kodlanan metin, başka bir kod sayfasında varsayılan veya tahmin edilen bir program tarafından doğru okunamaz.

Unicode bu felaketi çözmek için geldi. Sürüm 1, genellikle 16 bit olarak kodlanmış 65536 kod noktasıyla başladı. Daha sonra sürüm 2'de 1.1 milyon kod noktasına genişletildi. Mevcut sürüm 6.3, mevcut 1.1 milyon kod noktasının 110.187'sini kullanıyor. Bu artık 16 bite uymuyor.

Örneğin Microsoft ve Apple işletim sistemleri tarafından kullanılan v2 geldiğinde 16 bitlik kodlama yaygındı. Ve Java gibi dil çalışma zamanları. V2 spec, 1.1 milyon kod noktasını 16 bite eşleştirmenin bir yolunu buldu. UTF-16 adı verilen bir kodlama, bir kod noktasının 2 veya 4 bayt alabileceği değişken uzunluklu kodlama. Orijinal v1 kod noktaları 2 bayt, eklenenler 4 alır.

* Nix işletim sistemlerinde ve araçlarında kullanılan çok yaygın olan bir diğer değişken uzunluklu kodlama UTF-8'dir, bir kod noktası 1 ile 4 bayt arasında olabilir, orijinal ASCII kodları 1 bayt alır, geri kalanı daha fazla alır. Değişken olmayan tek uzunluk kodlaması UTF-32'dir, bir kod noktası için 4 bayt alır. Çok savurgan olduğu için sık kullanılmaz. UTF-1 ve UTF-7 gibi başkaları da göz ardı edilir.

UTF-16/32 kodlamaları ile ilgili bir sorun, bayt sırasının metin akışını oluşturan makinenin endianitesine bağlı olmasıdır. Bu yüzden UTF-16BE, UTF-16LE, UTF-32BE ve UTF-32LE karışımına ekleyin.

Bu farklı kodlama seçeneklerine sahip olmak, kod sayfası felaketini, UTF seçiminin "en iyi" olduğu programcılar arasında ateşli tartışmalarla bir dereceye kadar geri getirir. İşletim sistemi varsayılanları ile olan ilişkileri hemen hemen çizer. Karşı önlemlerden biri, bir metin akışının başlangıcında, akışın geri kalanının nasıl kodlandığını gösteren bir BOM, Bayt Sırası İşareti, özel bir kod noktası (U + FEFF, sıfır genişlik alanı) tanımıdır. Hem UTF kodlamasını hem de endianess'i gösterir ve bir metin oluşturma motorunda nötrdür. Ne yazık ki isteğe bağlıdır ve birçok programcı bunu ihmal etme haklarını talep etmektedir, bu nedenle kazalar hala oldukça yaygındır.


31

java Unicode için destek sağlar, yani tüm dünyadaki alfabe destekler. Java'daki karakter boyutu 2 bayttır. Ve aralık 0 ila 65535 arasındadır.

resim açıklamasını buraya girin


Açıklamak için Keypicture .. Güzel
Ponmari Subramanian

2
Çok kötü, yanlış. "ASCII Kodları (128)" doğru olur.
Mark Tolonen

15

ASCII'nin grafik karakterlere ve kontrol karakterlerine (kontrol kodları) ayrılmış 128 kod konumu vardır.

Unicode'un 1.114.112 kod konumu vardır. Bunların yaklaşık 100.000'i şu anda karakterlere tahsis edilmiştir ve birçok kod noktası kalıcı olarak karakter olmayan hale getirilmiştir (yani herhangi bir karakteri kodlamak için kullanılmamıştır) ve çoğu kod noktası henüz atanmamıştır.

ASCII ve Unicode'un ortak noktaları şunlardır: 1) Karakter kodlarıdır. 2) Unicode'un ilk 128 kod konumu, ASCII kontrol karakterlerinin kod konumlarının, kontrol karakterleri olarak sadece ASCII adlarına karşılık gelen isimlerle tanımlanması dışında ASCII ile aynı anlamlara sahip olduğu tanımlanmıştır, ancak anlamları Unicode'da tanımlanmamış.

Ancak bazen Unicode (Unicode standardında bile!) “Geniş ASCII” olarak karakterize edilir. Bu, temel olarak, Unicode'un bir zamanlar ASCII ile aynı şekilde evrensel bir karakter kodu olması gerektiği fikrini aktarmaya çalışan (ASCII'nin karakter repertuarının evrensel kullanım için umutsuzca yetersiz olmasına rağmen), farklı sistemler ve uygulamalar ve farklı diller için.

Unicode bu şekilde yalnızca karakterlerin “mantıksal boyutunu” tanımlar: Her karakterin belirli bir aralıkta bir kod numarası vardır. Bu kod numaraları farklı aktarım kodlamaları kullanılarak sunulabilir ve dahili olarak bellekte Unicode karakterler, karakter aralığına bağlı olarak genellikle karakter başına bir veya iki 16 bit miktar kullanılarak, bazen karakter başına bir 32 bit miktar kullanılarak temsil edilir.


2
Unicode için en yaygın kodlamanın bugünlerde UTF-8 olduğunu düşünüyorum. UTF-8 kod noktalarının çoğunu 1, 2 veya 3 bayt olarak kodlar.
Binarus

14

ASCII ve Unicode iki karakter kodlamasıdır. Temel olarak, dijital ortamda yazılabilir, saklanabilir, iletilebilir ve okunabilir olmaları için ikili karakterlerde fark karakterlerinin nasıl temsil edileceğine dair standartlardır. İkisi arasındaki temel fark, karakteri kodlama biçimidir ve her biri için kullandıkları bit sayısıdır. ASCII başlangıçta her karakteri kodlamak için yedi bit kullanmıştır. Daha sonra orijinalin görünen yetersizliğini gidermek için Genişletilmiş ASCII ile sekize çıkarıldı. Buna karşılık, Unicode 32, 16 ve 8 bit kodlama arasında seçim yapabileceğiniz değişken bir bit kodlama programı kullanır. Daha fazla bit kullanmak, daha büyük dosyalar pahasına daha fazla karakter kullanmanıza izin verirken, daha az bit size sınırlı bir seçenek sunar, ancak çok fazla yer tasarrufu sağlar. Daha az bit kullanma (ör.

Unicode'un sorunun olmasının ana nedenlerinden biri, standart olmayan birçok ASCII programından kaynaklandı. Microsoft ve diğer birçok yazılım şirketi tarafından kullanılan yaygın sayfayı kullanmadığınız sürece, karakterlerinizin kutu şeklinde görünmesiyle ilgili sorunlarla karşılaşabilirsiniz. Tüm karakter kod noktaları standartlaştırıldığı için Unicode bu sorunu neredeyse tamamen ortadan kaldırır.

Unicode'un bir diğer önemli avantajı, maksimumda çok sayıda karakteri barındırabilmesidir. Bu nedenle, Unicode şu anda çoğu yazılı dili içeriyor ve daha da fazlası için yer var. Buna İngilizce gibi tipik soldan sağa komut dosyaları ve hatta Arapça gibi sağdan sola komut dosyaları dahildir. Çince, Japonca ve diğer birçok varyant da Unicode'da temsil edilir. Yani Unicode yakında değiştirilmeyecek.

O sırada zaten yaygın olarak kullanılan eski ASCII ile uyumluluğu korumak için Unicode, ilk sekiz bitin en popüler ASCII sayfasınınkilerle eşleşeceği şekilde tasarlandı. Dolayısıyla, ASCII kodlu bir dosyayı Unicode ile açarsanız, dosyada doğru kodlanmış karakterleri almaya devam edersiniz. Bu, halihazırda ASCII kullananlar için yeni bir kodlama standardı benimsemenin etkisini azalttığı için Unicode'un benimsenmesini kolaylaştırdı.

Özet:

1.ASCII uses an 8-bit encoding while Unicode uses a variable bit encoding.
2.Unicode is standardized while ASCII isn’t.
3.Unicode represents most written languages in the world while ASCII does not.
4.ASCII has its equivalent within Unicode.

Alınan: http://www.differencebetween.net/technology/software-technology/difference-between-unicode-and-ascii/#ixzz4zEjnxPhs


1

Depolama

Verilen sayılar sadece 1 karakter depolamak içindir

  • ASCII ⟶ 2 7 bit ( 1 bayt )
  • Genişletilmiş ASCII ⟶ 2 8 bit (1 bayt)
  • UTF-8 ⟶ minimum 2 8 , maksimum 22 bit (min 1, maks 4 bayt)
  • UTF-16 ⟶ minimum 2 16 , maksimum 22 bit (min 2, maks 4 bayt)
  • UTF-32 ⟶ 2 32 bit (4 bayt)

Kullanım (Şubat 2020 itibariyle)

Çeşitli karakter kodlamaları kullanan web sitelerinin yüzdeleri


0

ASCII 128 karakteri tanımlar, çünkü Unicode 120.000 karakterden fazla bir repertuar içerir.


4
Bu önemsiz yinelenen "Yanıt" için -1, daha önceki cevaplara hiçbir şey eklemez. Lütfen bu tür yinelenen dağınıklığı eklemeyin (meşru olan başka yollarla destek alın).
cellepo

-1

UTF'nin ASCII'nin bir üst kümesi olmasının ötesinde, ASCII ve UTF arasında bilinmesi gereken bir diğer iyi fark, disk dosyası kodlaması ve rasgele bellekte veri gösterimi ve depolanmasıdır. Programlar, verilerin başlangıcında özel bayt sırası işareti kodları tespit ederek veya verilerin programlayıcı niyetinden verilerin metin olduğunu varsayarak ve daha sonra, verilerin bir metin kodlamasında veya başka bir kodlamada.

0xOnaltılı veri için geleneksel önek gösterimini kullanarak , temel iyi referans, ASCII metninin olası ASCII karakter değerlerinden birini temsil 0x00etmek için bayt değerleri ile başlamasıdır . UTF metni normalde UTF8 için baytlarla başlanarak belirtilir . UTF16 için bayt başlatmak veya başlangıç bayt emriyle belirtilen bayt metnin endian-lık sipariş ile kullanılır. Olası bayt değerlerinin ASCII aralığında olmayan basit bayt değerlerinin varlığı, verilerin muhtemelen UTF olduğunu da gösterir.0x7F0xEF 0xBB 0xBF0xFE 0xFF0xFF 0xFE

Verileri belirli bir kodlama standardında kodlanmış metin olarak yorumlanması gerektiğini belirtmek için farklı kodlar kullanan başka bayt sırası işaretleri vardır.

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.