UTF-8 ve ISO-8859-1 arasındaki fark nedir ?
UTF-8 ve ISO-8859-1 arasındaki fark nedir ?
Yanıtlar:
UTF-8, herhangi bir Unicode karakteri temsil edebilen çok baytlı bir kodlamadır. ISO 8859-1, ilk 256 Unicode karakteri temsil edebilen tek baytlık bir kodlamadır. Her ikisi de ASCII'yi aynı şekilde kodlar.
Wikipedia her ikisini de oldukça iyi açıklıyor: UTF-8 ve Latin-1 (ISO-8859-1). Eski değişken uzunluklu kodlama, ikinci tek baytlık sabit uzunluk kodlamasıdır. Latin-1, Unicode karakter kümesinin sadece ilk 256 kod noktasını kodlarken, UTF-8 tüm kod noktalarını kodlamak için kullanılabilir. Fiziksel kodlama seviyesinde, yalnızca 0 - 127 arasındaki kod noktaları aynı şekilde kodlanır; kod noktaları 128-255, UTF-8 ile 2 baytlık dizilim haline gelirken, Latin-1 ile tek bayttır.
UTF , 2 ^ 31 [kabaca 2 milyar] karakteri temsil edebilen Unicode kod noktalarını temsil edebilen çok baytlı kodlama şemaları ailesidir . UTF-8 , ilk 2 ^ 21 [kabaca 2 milyon] kod noktasını temsil etmek için 1 ile 4 bayt kullanan esnek bir kodlama sistemidir.
Uzun lafın kısası: 127'nin altında kod noktası / sıralı gösterim olan herhangi bir karakter, diğer bir deyişle 7 bit güvenli ASCII, diğer tek baytlık kodlamaların çoğu ile aynı 1 baytlık sıra ile temsil edilir. Kod noktası 127'nin üzerinde olan herhangi bir karakter iki veya daha fazla baytlık bir diziyle temsil edilir, burada kodlamanın özellikleri en iyi açıklanmıştır .
ISO-8859 , 127 ila 255 aralığında temsil edilebilen alfabe temsil etmek için kullanılan tek baytlık kodlama şemaları ailesidir. Bu çeşitli alfabe , en tanıdık olan ISO-8859- n biçiminde "parçalar" olarak tanımlanır bunlar muhtemelen ISO-8859-1, yani 'Latin-1'dir. UTF-8 ile olduğu gibi, 7 bit güvenli ASCII de kullanılan kodlama ailesinden bağımsız olarak etkilenmez.
Bu kodlama şemasının dezavantajı, 128'den fazla sembol içeren dilleri barındıramaması veya aynı anda birden fazla sembol ailesini güvenli bir şekilde gösterememesidir. Ayrıca, UTF'nin yükselmesiyle ISO-8859 kodlamaları da gözden düştü. Sorumlu ISO "Çalışma Grubu" 2004 yılında dağılmış ve bakımını ana alt komitesine bırakmıştır.
ASCII: 7 bit. 128 kod noktası.
ISO-8859-1: 8 bit. 256 kod noktası.
UTF-8: 8-32 bit (1-4 bayt). 1.112.064 kod noktası.
Hem ISO-8859-1 hem de UTF-8, ASCII ile geriye doğru uyumludur, ancak UTF-8, ISO-8859-1 ile geriye doğru uyumlu değildir:
#!/usr/bin/env python3
c = chr(0xa9)
print(c)
print(c.encode('utf-8'))
print(c.encode('iso-8859-1'))
Çıktı:
©
b'\xc2\xa9'
b'\xa9'
ISO-8859-1, 1980'lerde eski bir standarttır. Sadece 256 karakteri temsil edebilir, bu yüzden sadece batı dünyasındaki bazı diller için uygundur. Birçok desteklenen dil için bile, bazı karakterler eksik. Bu kodlamada bir metin dosyası oluşturup bazı Çince karakterleri kopyalayıp yapıştırmayı denerseniz, garip sonuçlar görürsünüz. Yani başka bir deyişle, kullanmayın. Unicode dünyayı ele geçirdi ve bazı eski nedenleriniz olmadığı sürece UTF-8 neredeyse standartlar.
Gerçekleştirilmesi gereken daha önemli bir şey: görürseniz iso-8859-1
, muhtemelen ISO / IEC 8859-1 yerine Windows-1252'yi ifade eder . ISO 8859-1'in C1 kontrol kodlarına sahip olduğu ve Windows-1252'nin kullanışlı görünür karakterlere sahip olduğu 0x80–0x9F aralığında farklılık gösterirler.
Örneğin, ISO 8859-1'in kontrol karakteri olarak 0x85 (Unicode, U + 0085, ``), Windows-1252'de yatay üç nokta (Unicode, U + 2026 YATAY ELLIPSIS'te …
) bulunur.
WHATWG Kodlama Spec (HTML kullandığı gibi) açıkça beyan iso-8859-1
için bir etiket olması windows-1252
ve web tarayıcıları herhangi bir şekilde ISO 8859-1 desteklemez: HTML Spec Kodlama spec tüm kodlamalar desteklenen ve daha fazla olması gerektiğini söyler .
Ayrıca ilgi çekici olan HTML sayısal karakter referansları, esas olarak Unicode kod noktaları yerine 8 bit değerler için Windows-1252 kullanır; https://html.spec.whatwg.org/#numeric-character-reference-end-state uyarınca , …
U + 0085 yerine U + 2026 üretir.
Bu soruyu araştırmamın nedeni perspektiften, hangi yönden uyumlu olduklarıdır. Latin1 karakter seti (iso-8859), bir utf8 veri deposunda saklanmak için% 100 uyumludur. Tüm ascii ve genişletilmiş ascii karakterleri tek bayt olarak saklanır.
Diğer yoldan gitmek, utf8'den Latin1 karakter kümesine kadar çalışabilir veya çalışmayabilir. Herhangi bir 2 baytlık karakter varsa (genişletilmiş ascii 255'ten fazla karakter) Latin1 veri deposunda depolanmaz.