UTF-8 ve ISO-8859-1 arasındaki fark nedir?


Yanıtlar:


321

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.


11
ASCII'nin sadece 0'dan 127'ye kadar uzandığını belirtmek gerekir. MSB her zaman 0'dır.
Hritik

3
127'nin üzerindeki kod noktaları tanımlandığında, kodlama sistemi Genişletilmiş ASCII'nin bir versiyonudur.
Rohan Bhale

1
@RohanBhale Extended ASCII ifadesini kullanma; sadece karışıklığa neden olur.
Bay Lister

Ancak genişletilmiş ascii doğru terim olabilir. Birden çok kaynakta okudum
Rohan Bhale

135

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.


@mu belki ifadem belirsizdi, ama yanlış değil - kodlanmış bayt dizileri hakkında konuşmuyordum, daha ziyade kodlanmış karakter kümeleri hakkında konuşuyordum; diğer bir deyişle, Unicode karakter kümesinin ilk 256 kod noktasını kodlamak için ISO-8859-1 kullanılır.
StaxMan

Açıklamanız benim için işe yarıyor ve "belirsiz", "yanlış" kelimeden daha iyi bir kelime seçimi olurdu.
mu çok kısa

83

UTF

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

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.


1
Soruyu cevapladığınız ancak ötesine geçtiğiniz ve ilgili kodlamalar hakkında bilgi sunduğunuz için +1. Re: UTF-8 için kod noktaları, stackoverflow.com/a/38488358/3353984'e göre UTF-8, 2 ^ 21 kod noktasını destekler. Bu bir hata mı yoksa burada bir düzeltme gerekebilir mi?
Tom Loredo

1
Unicode aslında 2 ^ 16 kodlu 17 düzlemdir. 0x00_0000 - 0x1F_FFFF. 17 uçak 1.114.112 kod noktasına uyum sağlayabilir. Bunlardan 2.048'i vekil, 66'sı karakter değildir ve 137.468 özel kullanım için ayrılmıştır, 974.530'u kamu görevine bırakmıştır. 1 milyon civarında. Bkz kaç karakter UTF-8 edebilir kodlamak? .
georgeawg

22
  • 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'

21

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.


1
Umlaut'ların UTF8 ile nerede dönüştürülmediğini görmüştüm. Bunun örneklerini gördük ve aramada ISO-8859-1'i bulduk ve işe yarıyor gibi görünüyor. Birlikte çalıştığımız bir sürü Alman bilim adamımız var.
Aggie Jon, 87

4
Umlaut'lar utf8'de iki karakter olarak temsil edilir. İyi dönüştürürler ve iyi çalışırlar. Sorun, karakter başına 1 bayt bekleyen programlardan geliyor. Bu eski programlar için, ISO-8859-1'in 1 baytlık sayıları vardır.
Erik Aronesty

3

Başka bir açıdan bakıldığında, hem unicode hem de ascii kodlamalarının içinde bir bayt bulundukları için okuma başarısız 0xc0oluyor, iso-8859-1 tarafından düzgün okunuyor gibi görünüyor. Uyarı, dosyanın elbette içinde unicode karakterler olmaması gerektiğidir.


2

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-1için bir etiket olması windows-1252ve 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.


Hata! Bunu yazdığımı sanıyordum, ama yeniden yazarak kaybettim. Şimdi içine koydum.
Chris Morgan

0

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.


2
Yardımcı oldu, ama genişletilmiş ascii 255 255 yerine 127 demek düşünüyorum?
Hydroper

18
Latin-1 veya iso-8859-1, utf8'de saklanmak için% 100 uyumlu değildir. 127'nin üzerindeki herhangi bir Latin-n veya iso-8859-n karakteri tek baytlık utf-8 karakterine çevrilmez. Bununla birlikte, 1-127 değerleri için tam olarak tercüme edilecektir.
Marlin Pierce

4
Bu cevap, ASCII olmayan herhangi bir karakter kodlamasına atıfta bulunan bir terim olan "genişletilmiş ascii" terimini kullanmasında biraz kafa karıştırıcıdır. UTF-8 ve latin-1, genişletilmiş ASCII kodlamalarına örnektir. Ancak, ascii olmayan latin-1 karakterleri (yani 127'nin üzerindeki kod noktaları) UTF-8'de tek bir bayt olarak kodlanamaz.
rdb
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.