UTF-8'in 8 bit olması, en fazla 256 farklı karakter olabileceği anlamına gelmez mi?
İlk 128 kod noktası ASCII'deki ile aynıdır. Ancak UTF-8'in milyon karaktere kadar destekleyebileceğini söylüyor?
Bu nasıl çalışıyor?
UTF-8'in 8 bit olması, en fazla 256 farklı karakter olabileceği anlamına gelmez mi?
İlk 128 kod noktası ASCII'deki ile aynıdır. Ancak UTF-8'in milyon karaktere kadar destekleyebileceğini söylüyor?
Bu nasıl çalışıyor?
Yanıtlar:
UTF-8 her zaman bir bayt kullanmaz, 1 ila 4 bayttır.
İlk 128 karakter (US-ASCII) bir bayta ihtiyaç duyar.
Sonraki 1.920 karakterin kodlanması için iki bayta ihtiyaç vardır. Bu, hemen hemen tüm Latin alfabelerinin geri kalanını ve ayrıca Yunan, Kiril, Kıpti, Ermenice, İbranice, Arapça, Süryanice ve Tāna alfabelerini ve Aksan İşaretlerini Birleştirme'yi kapsar.
Çoğu Çince, Japonca ve Korece [CJK] karakterleri de dahil olmak üzere ortak kullanımdaki [12] hemen hemen tüm karakterleri içeren Temel Çok Dilli Düzlemin geri kalanındaki karakterler için üç bayta ihtiyaç vardır.
Daha az yaygın CJK karakterleri, çeşitli tarihi komut dosyaları, matematiksel semboller ve emoji (piktografik semboller) içeren diğer Unicode düzlemlerindeki karakterler için dört bayta ihtiyaç vardır.
kaynak: Wikipedia
UTF-8 karakter başına 1-4 bayt kullanır: ascii karakterleri için bir bayt (ilk 128 unicode değeri ascii ile aynıdır). Ancak bu yalnızca 7 bit gerektirir. En yüksek ("işaret") bit ayarlanmışsa, bu çok baytlı bir dizinin başlangıcını gösterir; ardışık yüksek bit kümesinin sayısı, bayt sayısını, ardından bir 0'ı gösterir ve kalan bitler değere katkıda bulunur. Diğer baytlar için, en yüksek iki bit 1 ve 0 olacaktır ve kalan 6 bit değer içindir.
Dolayısıyla, dört baytlık bir dizi 11110 ... ile başlayacaktır (ve ... = değer için üç bit), ardından değer için her biri 6 bit olan üç bayt 21 bitlik bir değer verecektir. 2 ^ 21, unicode karakterlerinin sayısını aştığından, tüm unicode UTF8 olarak ifade edilebilir.
Göre bu tablodaki * UTF-8 gerektiğini desteklemektedir:
2 31 = 2.147.483.648 karakter
Ancak, RFC 3629 olası değerleri kısıtladı, bu nedenle şimdi 4 bayt ile sınırlandık , bu da bize
2 21 = 2.097.152 karakter
Bu karakterlerin büyük bir kısmının özel kullanım için "ayrılmış" olduğuna dikkat edin, bu aslında simge yazı tipleri için oldukça kullanışlıdır.
* Kullanılan Wikipedia 6 baytlık bir tablo gösteriyor - o zamandan beri makaleyi güncellediler.
2017-07-11: Birden çok bayt ile kodlanmış aynı kod noktasının iki kez sayılması nedeniyle düzeltildi
0xxxxxxx
7 kullanılabilir bit 110xxxxx 10xxxxxx
verir, 11 tane daha verir - örtüşme olmaz. İlk bayt 0
, ilk durumda ve 1
ikinci durumda ile başlar.
00000001
depolanır ve neyi 11000000 100000001
depolar?
Unicode, kod noktalarını karakterlere çözümler. UTF-8, Unicode için bir depolama mekanizmasıdır. Unicode'un bir özelliği vardır. UTF-8'in bir özelliği vardır. İkisinin de farklı sınırları vardır. UTF-8'in farklı bir yukarı sınırı vardır.
Unicode, "uçaklar" ile belirtilir . Her uçak 2 16 kod noktası taşır . Unicode'da 17 Uçak var. Toplam 17 * 2^16
kod noktası için. İlk uçak, uçak 0 veya BMP , taşıdığı şeyin ağırlığında özeldir.
Tüm nüansları açıklamak yerine, yukarıdaki uçaklarla ilgili makaleyi aktarmama izin verin.
17 uçak, 1.114.112 kod noktası barındırabilir. Bunların 2.048'i vekillerdir, 66'sı karakter değildir ve 137.468'i özel kullanım için ayrılmış olup, 974.530'u genel atama için bırakmıştır.
Şimdi yukarıda bağlantısı verilen makaleye geri dönelim,
UTF-8 tarafından kullanılan kodlama şeması, 2 31 kod noktası (32.768 düzlem) gibi çok daha büyük bir sınırla tasarlanmıştır ve 4 bayt ile sınırlı olsa bile 2 21 kod noktasını (32 düzlem) kodlayabilir . [3] Unicode, kod noktalarını UTF-16 tarafından kodlanabilen 17 düzlemle sınırladığından, 0x10FFFF üzerindeki kod noktaları UTF-8 ve UTF-32'de geçersizdir.
Böylece, geçerli Unicode olmayan şeyleri UTF-8'e koyabileceğinizi görebilirsiniz. Neden? UTF-8, Unicode'un desteklemediği kod noktalarını barındırdığı için.
UTF-8, dört baytlık bir sınırlamayla bile, 2 21 kod noktasını destekler ki bu,17 * 2^16
2.164.864 "karakter" potansiyel olarak UTF-8 tarafından kodlanabilir.
Bu sayı, kodlamanın çalışma şeklinden gelir:27 + 211 + 216 + 221
1 baytlık karakterlerin kodlama için 7 biti vardır
0xxxxxxx
(0x00-0x7F)
2 baytlık karakterlerde kodlama için 11 bit bulunur
110xxxxx 10xxxxxx
(ilk bayt için 0xC0-0xDF; ikincisi için 0x80-0xBF)
3 baytlık karakterlerin kodlama için 16 bitleri vardır
1110xxxx 10xxxxxx 10xxxxxx
(ilk bayt için 0xE0-0xEF; devam baytları için 0x80-0xBF)
4 baytlık karakterlerin kodlama için 21 biti vardır
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
(ilk bayt için 0xF0-0xF7; devam baytları için 0x80-0xBF)
Gördüğünüz gibi bu, mevcut Unicode'dan (1.112.064 karakter) önemli ölçüde daha büyük.
GÜNCELLEME
İlk hesaplamam yanlış çünkü ek kuralları dikkate almıyor. Daha fazla ayrıntı için bu cevaba yapılan yorumlara bakın.
2^21
ve diğer olası kombinasyonları unuttu.
UTF-8, karakter başına minimum 8 bit içeren değişken uzunluklu bir kodlamadır .
Daha yüksek kod puanına sahip karakterler 32 bit alacaktır.
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
, gerçek karakteri kodlamak için yalnızca 21 bit kullanılabilir.
Wikipedia'dan alıntı: "UTF-8, bir ila dört 8 bitlik bayt (Unicode Standardında" sekizli "olarak adlandırılır) kullanarak Unicode karakter kümesindeki 1.112.064 kod noktasının her birini kodlar."
Bazı bağlantılar:
Unicode Standardına ve SSS girişi, UTF-8 UTF-16, UTF-32 ve BOM gibi ilgili bilgilere göz atın . Bu o kadar düzgün bir seyir değil, ancak güvenilir bir bilgi ve başka yerlerde UTF-8 hakkında okuyabileceğiniz şeylerin çoğu şüpheli.
“UTF-8” deki “8” kod birimlerinin bit cinsinden uzunluğuyla ilgilidir . Kod birimleri, karakterleri kodlamak için kullanılan varlıklardır, basit bir bire bir eşleme olması gerekmez. UTF-8, bir karakteri kodlamak için değişken sayıda kod birimi kullanır.
UTF-8'de kodlanabilen karakter koleksiyonu, UTF-16 veya UTF-32 ile tamamen aynıdır, yani tüm Unicode karakterleri. Hepsi, karakter olmayanları ve atanmamış kod noktalarını da içeren tüm Unicode kodlama alanını kodlar.
Mevcut maksimum UTF-8 kodları (2.164.864) konusunda mpen ile hemfikir olsam da (aşağıda listelenmiştir, onun hakkında yorum yapamam), UTF-8'in 2 ana kısıtlamasını kaldırırsanız 2 seviye geride kalır: sadece 4 bayt limit ve 254 ve 255 kodları kullanılamaz (sadece 4 bayt limitini kaldırdı).
Başlangıç kodu 254, başlangıç bitlerinin temel düzenlemesini izler (çok bitli bayrak 1'e ayarlanmış, 6 1'lik bir sayım ve terminal 0, yedek bit yok) birlikte çalışmanız için 6 ek bayt verir (6 10xxxxxx grup, ek 2 ^ 36 kod).
Başlangıç kodu 255 temel kurulumu tam olarak takip etmez, terminal 0 yoktur, ancak tüm bitler size 7 ek bayt verir (çok bitli bayrak 1'e ayarlanmış, 7 1'in sayısı ve tüm bitler kullanıldığı için terminal 0 yok) ; 7 10xxxxxx grubu, ek 2 ^ 42 kod).
Bunları eklemek, 4,468,982,745,216 nihai maksimum gösterilebilir karakter kümesi verir. Bu, mevcut kullanımdaki, eski veya ölü dillerdeki ve kaybolduğuna inanılan dillerdeki tüm karakterlerden daha fazlasıdır. Melek veya Göksel senaryo var mı?
Ayrıca, 254 ve 255: 128-191 ve birkaçına ek olarak UTF-8 standardında gözden kaçan / yok sayılan tek bayt kodları vardır. Bazıları klavye tarafından yerel olarak kullanılır, örnek kod 128 genellikle bir silme geri almasıdır. Diğer başlangıç kodları (ve ilişkili aralıklar) bir veya daha fazla nedenden dolayı geçersizdir ( https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences ).
Unicode, UTF-8 ile sıkı bir şekilde evlidir. Unicode, UTF-8 tarafından desteklenen tam olarak aynı sayıda kod noktası olan 2 ^ 21 kod noktasını (2.097.152 karakter) özellikle destekler. Her iki sistem de kod noktaları vb. İçin aynı 'ölü' alanı ve sınırlı bölgeleri ayırır ... Haziran 2018 itibarıyla en son sürüm olan Unicode 11.0 137.439 karakterlik bir repertuar içerir
Unicode standardından. Unicode SSS
Unicode Standard, 21 bitlik bir kod alanı anlamına gelen U + 0000..U + 10FFFF aralığındaki karakterleri kodlar.
UTF-8 Wikipedia sayfasından. UTF-8 Tanımı
Unicode kod uzayının 2003 yılında 21 bitlik değerlerle kısıtlanmasından bu yana, UTF-8 kod noktalarını bir ila dört bayta kodlamak için tanımlanmıştır, ...