İngilizce karakterler neden diğer alfabelere göre daha az bayt gerektiriyor?


31

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?


22

22
"İngilizce karakterler" diye bir şey olduğunu sanmıyorum. Onlar Romalılar.
Raphael,

5
@Raphael herkes onun ne demek istediğini biliyor. Ama güzel ekle.
Mathias Lykkegaard Lorenzen

1
@Raphael Aslında, İngilizce'de kullanılmayan ve bu yüzden ASCII karakter kümesinde bulunmayan birçok Roma harfleri vardır. Bunların çoğu değiştiricileri içerir, ancak yine de İngilizce dışındaki diğer Latince türetilmiş dillerdeki metinleri düzgün şekilde oluşturmak için hâlâ gereklidir.
Wutaz

7
@Raphael “Roma karakterleri” diye bir şey olduğunu sanmıyorum. Onlar Latin.
Blacklight Shining

Yanıtlar:


41

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.


26
Herhangi bir normal kodlama veya dosya biçiminde dosyanın sonunu kodlayan son bayt yoktur. Bir program bir dosyayı okuduğunda, dosyanın sonu işletim sistemi tarafından özel bir şekilde bildirilebilir, ancak bu farklı bir konudur.
Jukka K. Korpela

2
Unicode UTF-8 sürümünde ա karakteri 2 bayttır (0xD5A1); ekstra karakter (her ne ise) her iki dosyada da bulunur. marathon-studios.com/unicode/U0561/Armenian_Small_Letter_Ayb
Dan Ne yazık ki

6
@khajvah İsterseniz echo 'ա' > file.txtveya 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 0aveya satır beslemesi olacaktır.
Daniel Beck

7
@DoktoroReichard: Unicode'un kodlama olmadığını cevabında açıklığa kavuşturunuz ; bunun yerine, soyut bir karakter kümesidir ve UTF-16 ve UTF-8, Unicode kod noktalarının kodlamalarıdır. Cevabınızın son paragrafları çoğunlukla UTF-8 hakkında konuşur. Ancak bir dosya UTF-16 kullanıyorsa, herhangi bir kod noktası, bir tanesine bile olsa, aiki bayt (veya ikisinin katları) kullanır.
Grawity

6
Ayrıca “genişletilmiş ASCII” karakter setlerinin aslında ASCII olmadığını ve sekizinci biti kullanmanın farklı yollarının sayısının hepsini büyük bir karışıklık haline getirdiğini vurgulamakta fayda var. Bunun yerine sadece UTF-8 kullanın.
ntoskrnl

17

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.


bu yüzden aslında neden daha fazla alan kullanıldığını açıklayan tek cevap bu.
Félix Gagnon-Grenier

10

UTF-8'de ASCII karakterleri bir bayt, diğer karakterler iki, üç veya dört bayt kullanır.


1
Bunun neden olduğunu açıklayabilir misiniz? İki kodlama yönteminin belirtilmesi soruyu tam olarak cevaplamaz.
MaQleod

@ MaQleod Unicode, ASCII'nin yerini almak üzere yaratıldı. Geriye dönük uyumluluk için, ilk 128 karakter aynıdır. Bu 128 karakter bir bayt ile ifade edilebilir. Ek karakterler için ek baytlar eklenir.
Jason

Farkındayım, ancak bu ASCII karakterlerini farklı kılan şeyin ne olduğu sorusunun cevabının bir parçası. OP'ye açıklanmalıdır.
MaQleod

@ MaQleod Unicode Konsorsiyumu'nun çoğunlukla Amerikan şirketlerinden oluştuğu ve İngilizce karakterlerine karşı önyargılı olduğu söylenebilir. Basit bir cevabın öznel bir cevaptan daha iyi olduğunu düşündüm.
Jason

15
Unicode karakter kümesinin birkaç kodlamasından sadece biri olan UTF8'de "Unicode'da" değil.
Sebastian Negraszus

3

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.


Cevap için teşekkür ederim. Diğer baytlar, kullandığım programın sonuna otomatik olarak yeni bir satır karakteri eklediğinden kaynaklanıyor.
khajvah

1
UTF-8'in ASCII verileriyle verimlilik için uyumluluk açısından çok fazla tasarlandığını sanmıyorum . UTF-8, 7 bitlik ASCII içeriğinin (yüksek bit sıfıra ayarlanmış olarak) UTF-8 ile kodlanmış aynı içeriğe sahip olması bakımından çok hoş bir özelliğe sahiptir, bu nedenle normal olarak ASCII ile ilgilenen araçlar için, bu bir değiştirme yerine geçer. . Başka hiçbir Unicode kodlama şeması bildiğim kadarıyla bu özelliğe sahip değildir. UTF-8, özellikle Unicode BMP alanında kalıyorsanız, çoğu veri için oldukça kompakttır .
CVn

1
@ MichaelKjörling, bu özelliğe bir referans ekledim. Ancak, ilk günlerde Unicode'a yapılan büyük bir itiraz verimsizlikti ve UTF-16 baskın olarak Ascii olan verilerin boyutunu ikiye katlıyordu. UTF-8, örneğin İngilizce metin için, kullandığınız Ascii olmayan karakterler için yalnızca “ödediğiniz” anlamına gelir.
Jukka K. Korpela

3

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.


2

Windows 8.1 ABD / İngilizce Not Defteri ile kaydedilmiş tek bir 'a' dosyası.

  • ANSI 1 bayt olarak kaydet
  • Unicode 4 bayt olarak kaydet
  • UTF-8 4 bayt olarak kaydet

Not Defteri ile kaydedilen tek bir ա ա dosya

  • ANSI olarak kaydet mümkün değil
  • Unicode 4 bayt olarak kaydet
  • UTF-8 5 bayt olarak kaydet

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.


4
Not Defteri (ve genel olarak Windows) burada kafa karıştırıcı terminoloji kullanır. "ANSI" yerel bağımlı bir tek bayt kodlamasıdır (İngilizce sürümlerinde Windows 1252) ve "Unicode" UTF-16'dır.
ntoskrnl

@ntoskrnl Bu doğru, ancak kodlama için açılan kutuya bakıyorsanız, ANSI diyor, bu yüzden farklı bir OEM kod sayfanız varsa bundan bahsetmiştim, farklı sonuçlar alabilirsiniz.
Darryl Braaten

2

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.

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.