Bir metin dosyasına 'a' koyduğumda 2 bayt yapar, fakat Ermeni alfabesinden bir harf olan 'ա' diyelim, 3 bayt yapar.
Bir bilgisayar için alfabe arasındaki fark nedir?
İngilizce neden daha az yer kaplar?
Bir metin dosyasına 'a' koyduğumda 2 bayt yapar, fakat Ermeni alfabesinden bir harf olan 'ա' diyelim, 3 bayt yapar.
Bir bilgisayar için alfabe arasındaki fark nedir?
İngilizce neden daha az yer kaplar?
Yanıtlar:
Yaygın bilgisayarlarda kullanılmak üzere geliştirilen ilk kodlama şemalarından biri ASCII ( Amerikan Bilgi Alışverişi Standart Kodu ) standardıdır. Amerika Birleşik Devletleri'nde 1960'lı yıllarda geliştirilmiştir.
İngilizce alfabe, Latin alfabesinin bir bölümünü kullanır (örneğin, İngilizce'de birkaç vurgulu kelime vardır). Harf düşünülmeden bu alfabede 26 ayrı harf vardır. Ayrıca, İngilizce alfabeyi kodlayan gibi görünen herhangi bir düzende bireysel sayılar ve noktalama işaretleri bulunmalıdır.
1960'lar aynı zamanda bilgisayarların şu anda sahip olduğumuz miktarda bellek ya da disk alanına sahip olmadığı bir zamandı. ASCII, tüm Amerikan bilgisayarlarında işlevsel bir alfabenin standart bir gösterimi olarak geliştirilmiştir. O zamanlar, her ASCII karakterinin 8 bit (1 byte) uzunluğuna getirilmesi kararı, zamanın teknik detayları nedeniyle yapıldı (Wikipedia makalesi, perfore bantın bir anda 8 bit tuttuğu gerçeğinden bahseder). Aslında, orijinal ASCII şeması 7 bit kullanılarak iletilebilir, sekiz tanesi parite kontrolleri için kullanılabilir. Daha sonraki gelişmeler, orijinal ASCII şemasını birkaç aksanlı, matematiksel ve terminal karakter içerecek şekilde genişletti.
Dünya genelinde bilgisayar kullanımındaki son artışla birlikte, farklı dillerden giderek daha fazla insan bir bilgisayara erişiyordu. Bu, her dil için, farklı dil terminallerinden okunduğunda çakışacak olan diğer programlardan bağımsız olarak yeni kodlama şemalarının geliştirilmesi gerektiği anlamına geliyordu.
Unicode , olası tüm anlamlı karakterleri tek bir soyut karakter setinde birleştirerek farklı terminallerin varlığına bir çözüm olarak geldi.
UTF-8 , Unicode karakter kümesini kodlamanın bir yoludur. Değişken genişlikte bir kodlamadır (örneğin, farklı karakterler farklı boyutlarda olabilir) ve önceki ASCII şemasıyla geriye dönük uyumluluk için tasarlanmıştır. Böylece, ASCII karakter seti bir bayt büyük, diğer karakter iki ya da daha fazla bayt büyük kalacaktır. UTF-16, Unicode karakter kümesini kodlamanın başka bir yoludur. UTF-8'e kıyasla, karakterler bir veya iki 16 bitlik kod birimi kümesi olarak kodlanır.
Yorumlarda belirtildiği gibi, 'a' karakteri tek bir bayt, 'ա' ise UTF-8 kodlamasını ifade eden iki byte kaplar. Sorunuzdaki fazlalık bayt, sonunda (OP'nin öğrendiği) newline karakterinin varlığından kaynaklanıyordu.
echo 'ա' > file.txt
veya bazı düzenleyicileri kullanarak dosyayı düzenlerseniz, ondan sonra otomatik olarak yeni bir satır eklerler. Çalıştıysanız xxd file.txt
, son bayt muhtemelen bir 0a
veya satır beslemesi olacaktır.
a
iki bayt (veya ikisinin katları) kullanır.
1 bayt 8 bittir ve bu nedenle 256 (2 ^ 8) farklı değere kadar temsil edebilir.
Bundan daha fazla olasılık gerektiren diller için, 1'den 1'e kadar basit bir haritalama korunamaz, bu nedenle karakter kaydetmek için daha fazla veri gerekir.
Genel olarak, çoğu kodlamanın ASCII karakterleri için ilk 7 bit (128 değer) kullandığını unutmayın . Bu, 8'inci bit veya daha fazla karakter için 128 değer daha bırakır. . . aksanlı karakterler, Asya dilleri, Kiril vb. eklerseniz, tüm karakterleri tutmak için neden 1 baytın yeterli olmadığını kolayca görebilirsiniz.
UTF-8'de ASCII karakterleri bir bayt, diğer karakterler iki, üç veya dört bayt kullanır.
Bir karakter için gereken bayt miktarı (sorunun açıkça görünüşte olduğu) karakter kodlamasına bağlıdır. ArmSCII kodlamasını kullanırsanız, her Ermeni mektubu yalnızca bir bayt tutar. Bu günlerde iyi bir seçim değil.
Unicode için UTF-8 aktarım kodlamasında karakterlerin farklı sayıda bayta ihtiyacı vardır. İçinde “a” sadece bir bayt alır (iki bayt hakkındaki fikir bir tür karışıklıktır), “á” iki bayt alır ve Ermeni mektubu ayb “ա” da iki bayt alır. Üç bayt, bir çeşit karışıklık olmalı. Buna karşılık, örneğin Bengalce harf "অ" UTF-8'de üç bayt alır.
Arka plan basitçe UTF-8'in Ascii karakterleri için oldukça verimli olması, Avrupa ve çevredeki sistemler için oldukça verimli olması ve gerisinin daha az verimli olması için tasarlandı. Bu, temel Latince harflerin (ingilizce metninin çoğunlukla ne olduğu), bir karakter için yalnızca bir bayta ihtiyaç olduğu anlamına gelir; Yunanca, Kiril, Ermeni ve birkaç diğerleri için iki bayta ihtiyaç vardır; geri kalan her şeyin daha çok ihtiyacı var.
UTF-8 (bir yorumda belirtildiği gibi) Ascii verilerinin (uzun süredir neredeyse tek yol olan 8 bitlik birimler olarak temsil edildiğinde) asılsız UTF-8 kodlu olması gibi faydalı özelliklere de sahiptir.
1960'larda (ve çok ötesinde) karakter kodları makineye özgüdür. 1980'lerde kısaca 36 bit kelime ve karakter kodlaması başına 5, 6 ve 8 ( IIRC ) bit olan bir DEC 2020 makinesi kullandım . Ondan önce EBCDIC ile IBM 370 serisi kullandım. 7 bitlik ASCII düzen getirdi, ancak ilk PC'leri boyamak için her çeşit kutu çizme karakterleri ve daha sonra Latin-1 (8 bit kodlamalar, ASCII gibi ilk 7 bit ve benzeri ya da diğerleri gibi "ulusal karakterler" için diğer yarısı ñ
, Ç
muhtemelen en popülerleri Latin karakterleri (ve aksanlar ve türevleri) kullanan İngilizce ve çoğu Avrupa dillerine uyarlanmış Latin-1'dir.
İngilizce ve İspanyolca gibi metinleri karıştırmak iyi geçti (sadece her ikisinin de üst üste Latin-1 kullanın), ancak farklı bir kodlama kullanan (örneğin, Japonca gibi bir Asya dilinden bahsetmeyen Yunanca veya Rusça pasajı da dahil) herhangi bir şeyi karıştırmaktı. gerçek bir kabus. En kötüsü, Rus ve özellikle de Japon ve Çin’in pek çok popüler, tamamen uyumsuz kodlaması vardı.
Bugün, İngilizce karakterleri destekleyen UTF-8 gibi verimli kodlamalar için kullanılan Unicode kullanıyoruz (şaşırtıcı şekilde, İngilizce harflerin kodlanması ASCII'ye denk geliyor), bu yüzden İngilizce olmayan birçok karakterin daha uzun kodlamalar kullanmasını sağlıyoruz.
Windows 8.1 ABD / İngilizce Not Defteri ile kaydedilmiş tek bir 'a' dosyası.
Not Defteri ile kaydedilen tek bir ա ա dosya
Tek bir 'a', ANSI'de tek bir bayt olarak kodlanır, Unicode'da her karakter genellikle 2 bayttır, ayrıca dosyanın başında 2 bayt BOM (Bayt Sırası İşaretçisi) vardır. UTF-8 bir 3 byte malzeme listesi ve bir de byte karakterine sahiptir.
'Ա' için bu karakter ANSI karakter kümesinde mevcut değildir ve makineme kaydedilemez. Unicode dosyası öncekiyle aynıdır ve UTF-8 dosyası karakter 2 bayt alırken 1 bayt daha büyüktür.
Makineniz farklı bir bölgedeyse, ASCII aralığında mümkün olan 255 karakter için farklı glifleri olan farklı bir OEM kod sayfasına sahip olabilirsiniz. @Ntoskrnl'de belirtildiği gibi, makinemin OEM kod sayfası ABD İngilizcesi için varsayılan olan Windows-1252 olacaktır.
Karakterlerin nasıl saklandıklarıyla ilgileniyorsanız, www.unicode.org adresine gidip etrafa bakabilirsiniz. Ana sayfalarının en üstünde, Unicode'da bulunan tüm karakter kodlarını gösteren bir "Kod Grafikleri" bağlantısı vardır.
Sonuçta, Unicode'da bir milyondan fazla kod vardır (hepsi kullanılmaz). Bir bayt 256 farklı değer tutabilir, bu nedenle eğer her olası Unicode kodunu saklamak istiyorsanız üç bayta ihtiyacınız olacaktır.
Bunun yerine, Unicode genellikle bazı karakterler için daha az bayt ve diğerleri için daha fazla kullanan "UTF-8" kodlamasında depolanır. İlk 128 kod değeri bir baytta, ilk 2048 kod değeri iki baytta, 65536 üç baytta saklanır ve gerisi dört bayt alır. Bu, daha sık kullanılan kod değerlerinin daha az yer kaplayacak şekilde düzenlenmiştir. AZ, az, 0-9 ve! @ $% ^ & * () - [} {}; ': "|,. / <>? Ve unuttuğum bazıları bir bayt alır; neredeyse tamamı İngilizce,% 98 Almanca ve Fransızca (sadece tahmin) karakter başına bir baytta saklanabilir ve bunlar en çok kullanılan karakterlerdir: Kiril, Yunanca, İbranice, Arapça ve diğerleri karakter başına iki bayt kullanır, Hint dili, Çince, Japonca , Korece, Tayca, tonlarca matematiksel sembol, karakter başına üç bayt ile yazılabilir. Nadir şeyler (Doğrusal A veya Doğrusal B, Emojiler'de metin yazmak istiyorsanız) dört bayt alır.
Başka bir kodlama UTF-16'dır. UTF-8'de 1, 2 veya 3 bayt alan her şey UTF-16'da iki bayt alır. Aralarında çok az latin karakterli Çince veya Japonca metinleriniz varsa bu bir avantajdır.
UTF-8 tasarımının nedenleri hakkında: Diğer tasarımlara göre birçok avantaja sahiptir. Onlar:
US-ASCII karakterleriyle uyumluluk
Makul kompaktlık
Kendi kendine senkronizasyon: UTF-8 kodlamasında karakter olan bir bayt dizisinin bir parçası size verilirse karakterin nerede başladığını öğrenebilirsiniz. Bazı kodlamalarda, hem xy hem de yx karakterlerin geçerli kodlamaları olabilir, bu nedenle bir dizinin bir parçası verilirse ... xyxyxyxyxyxyxy ... hangi karakterlere sahip olduğunuzu bilemezsiniz.
Sıralama doğruluğu: UTF-8 kodlu karakterleri içeren dizeleri bayt değerlerine göre sıralarsanız, otomatik olarak Unicode değerlerine göre sıralanırlar.
Tek bayt kodla uyumlu: Tek bayt değerlerini varsayan çoğu kod, UTF-8 kodlu karakterlerle otomatik olarak düzgün çalışır.
Artı unuttuğum sebepler.