it-swarm-tr.com

UTF-8 ve Unicode arasındaki fark nedir?

İnsanlardan çelişkili görüşler duydum - Wikipedia UTF-8 sayfasına göre.

Onlar aynı şeyler, değil mi? Birisi netleşebilir mi?

440
sarsnake

Başkalarının verdiği cevapları genişletmek için:

Bilgisayarların ideal olarak görüntülemesi gereken birçok karakter içeren birçok dile sahibiz. Unicode, her karaktere benzersiz bir sayı veya kod noktası atar.

Bilgisayarlar, baytlar gibi sayılarla uğraşır ... burada biraz geçmiş atlayarak ve bellek adresleme sorunlarını göz ardı ederek, 8-bit bilgisayarlar, 8-bit baytları, donanımda kolayca temsil edilen en büyük sayısal birim olarak, 16-bit bilgisayarlar genişletecekler. bu iki bayta, vb.

ASCII gibi eski karakter kodlamaları (önceden) 8 bitlik dönemdendir ve o sırada bilgisayardaki baskın dili, yani İngilizce'yi 0 ile 127 arasında değişen sayılara sıkıştırmaya çalışır (7 bit ). Alfabedeki 26 harfle, hem büyük hem de büyük olmayan biçimde, sayılar ve noktalama işaretleri oldukça iyi işledi. ASCII İngilizce dışındaki diğer diller için 8. bit ile genişletildi, ancak bu genişletme tarafından sağlanan ek 128 sayı/kod noktası, görüntülenen dile bağlı olarak farklı karakterlerle eşleştirilecek. ISO-8859 standartları bu haritanın en yaygın biçimleridir; ISO-8859-1 ve ISO-8859-15 (ayrıca ISO-Latin-1, latin1 olarak da bilinir ve evet, 8859 ISO standardının da iki farklı sürümü vardır).

Ancak, birden fazla dilden karakterleri temsil etmek istediğinizde bu yeterli değildir, bu nedenle mevcut tüm karakterleri tek bir bayta sıkıştırmak işe yaramaz.

Temel olarak iki farklı kodlama türü vardır: Bir tanesi daha fazla bit ekleyerek değer aralığını genişletir. Bu kodlamaların örnekleri UCS2 (2 bayt = 16 bit) ve UCS4 (4 bayt = 32 bit) olacaktır. Limit çok yüksek olsa bile, doğal olarak ASCII ve ISO-8859 standartları ile aynı sorundan muzdariptirler.

Diğer kodlama türü, karakter başına değişken bayt sayısını kullanır ve bunun için en yaygın olarak bilinen kodlamalar UTF kodlamalarıdır. Tüm UTF kodlamaları kabaca aynı şekilde çalışır: UTF-8 için 8 bit, UTF-16 için 16 bit ve UTF-32 için 32 bit olan bir birim boyutu seçersiniz. Ardından standart, bu bitlerin birkaçını bayrak olarak tanımlar: eğer ayarlanmışlarsa, birimler sırasındaki bir sonraki birim aynı karakterin bir parçası olarak kabul edilir. Ayarlanmamışlarsa, bu birim bir karakteri tamamen temsil eder. Bu nedenle, en yaygın (İngilizce) karakterler UTF-8'de bir bayt işgal eder (UTF-16'da iki, UTF-32'de 4), ancak diğer dil karakterleri altı bayt veya daha fazlasını içerebilir.

Çok baytlı kodlamalar (yukarıdaki açıklamadan sonra çok birim demeliyim), nispeten alan açısından verimli olma avantajına sahiptir, ancak alt kısımları bulma, karşılaştırmalar, vb. Gibi işlemlerin hepsinin kod kodunu çözmesi gereken karakterlerin kodunu çözmesi gerekir. Bu tür işlemlerden önce noktalar gerçekleştirilebilir (yine de bazı kısayollar vardır).

Hem UCS standartları hem de UTF standartları, Unicode'da tanımlanan kod noktalarını kodlar. Teoride, bu kodlamalar herhangi bir sayıyı kodlamak için kullanılabilir (kodlamanın desteklediği aralık dahilinde) - ama elbette bu kodlamalar Unicode kod noktalarını kodlamak için yapıldı. Ve bu onlar arasındaki ilişkiniz.

Windows, "Unicode" olarak adlandırılan dizeleri UTF-16 dizeleri olarak ele alırken, çoğu UNIX varsayılan olarak UTF-8 olarak kullanılır. HTTP gibi iletişim protokolleri UTF-8 ile en iyi şekilde çalışma eğilimindedir, çünkü UTF-8'deki birim büyüklüğü ASCII ile aynıdır ve bu tür çoğu protokol ASCII döneminde tasarlanmıştır. Öte yandan, UTF-16 tüm yaşayan dilleri temsil ederken en iyi ortalama alan/işlem performansını verir.

Unicode standardı, 32 bitte gösterilebilecek olandan daha az kod noktası tanımlar. Böylece, tüm pratik amaçlar için UTF-32 ve UCS4, UTF-32'de çoklu ünite karakterleriyle uğraşmanız gerekmediğinden aynı kodlama haline geldi.

Umarım bazı detayları doldurur.

439
unwesen

"Unicode" ne yazık ki içeriğe bağlı olarak çeşitli şekillerde kullanılır. En doğru kullanımı (IMO) kodlanmış karakter kümesi - yani bir karakter kümesi ve karakterler ile tam sayı arasında eşleştirme kod noktaları bunları temsil eder.

TF-8 bir karakter kodlamasıdır - bayt dizilerinden karakter dizilerine dönüşmenin bir yolu ve bunun tersi. Unicode karakter kümesinin tamamını kapsar. ASCII karakter başına tek bir bayt olarak kodlanır ve diğer karakterler tam kod noktalarına bağlı olarak daha fazla bayt alır (şu anda tanımlanmış tüm kod noktaları için 4 bayta kadar, yani U-0010FFFF'ye ve gerçekten 4 bayt, U-001FFFFF ile başa çıkabilirdi).

"Unicode" bir karakter kodlamasının adı olarak kullanıldığında (örneğin, .NET Encoding.Unicode özelliği), genellikle TF-16 , en yaygın karakterleri kodlayan anlamına gelir. İki bayt olarak. Bazı platformlar (özellikle .NET ve Java) UTF-16'yı "yerel" karakter kodlamaları olarak kullanırlar. Tek bir UTF-16 değerinde kodlanamayan karakterler hakkında endişelenmeniz gerekiyorsa, bu kıllı sorunlara neden olur ("vekil çiftler" olarak kodlanırlar) - ancak çoğu geliştirici bu konuda endişelenmez, IME.

Unicode ile ilgili bazı referanslar:

193
Jon Skeet

Bu konuyu açıklamak için bir örnek kullanmama izin verin:

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001

Şu ana kadar büyülü bir şey yok, çok basit. Şimdi, bu karakteri sabit diskimize kaydetmeye karar verdiğimizi varsayalım. Bunu yapmak için karakteri ikili biçimde saklamamız gerekiyor. '01101100 01001001' olarak saklayabiliriz. Bitti!

Fakat bir dakika bekleyin, '01101100 01001001' bir karakter mi yoksa iki karakter mi? Bunun bir karakter olduğunu biliyordun, çünkü sana söyledim, ama bir bilgisayar okuduğunda hiçbir fikri olmaz. Bu yüzden, bilgisayara bir tek gibi davranmasını söylemek için bir çeşit "kodlama" yapmamız gerekiyor.

UTF-8'in kurallarının girdiği yer: http://www.fileformat.info/info/unicode/utf8.htm

Binary format of bytes in sequence

1st Byte    2nd Byte    3rd Byte    4th Byte    Number of Free Bits   Maximum Expressible Unicode Value
0xxxxxxx                                                7             007F hex (127)
110xxxxx    10xxxxxx                                (5+6)=11          07FF hex (2047)
1110xxxx    10xxxxxx    10xxxxxx                  (4+6+6)=16          FFFF hex (65535)
11110xxx    10xxxxxx    10xxxxxx    10xxxxxx    (3+6+6+6)=21          10FFFF hex (1,114,111)

Yukarıdaki tabloya göre, eğer bu karakteri 'UTF-8' formatını kullanarak saklamak istiyorsak, karakterimizi bazı 'başlıklar' ile öneklememiz gerekir. Çince karakterimiz 16 bit uzunluğundadır (ikili değeri kendiniz sayınız), bu nedenle satır 3'teki formatı yeterli alan sağladığı için kullanacağız:

Header  Place holder    Fill in our Binary   Result         
1110    xxxx            0110                 11100110
10      xxxxxx          110001               10110001
10      xxxxxx          001001               10001001

Sonucu tek satırda yazmak:

11100110 10110001 10001001

Bu, çince karakterin UTF-8 (ikili) değeridir! (kendin onayla: http://www.fileformat.info/info/unicode/char/6c49/index.htm )

Özet

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001
embed 6C49 as UTF-8:      11100110 10110001 10001001

Not; Bu konuyu python ile öğrenmek istiyorsanız, buraya tıklayın

190
Cheng

Aynı şey değiller - UTF-8 Unicode'u kodlamanın özel bir yoludur.

Uygulamanıza ve kullanmayı düşündüğünüz verilere bağlı olarak seçebileceğiniz birçok farklı kodlama vardır. En yaygın UTF-8, UTF-16 ve bildiğim kadarıyla UTF-32.

107
Greg

Unicode yalnızca tanımla kod noktaları, yani karakteri temsil eden bir sayı. Bu kod noktalarını bellekte nasıl sakladığınız --- kullandığınız kodlama 'ya bağlıdır. UTF-8, diğerlerinin yanı sıra Unicode karakterleri kodlamanın bir yoludur.

63
Martin Cote

Unicode ISO/IEC 10646 ile birlikte tanımlayan bir standarttır. Evrensel Karakter Seti (UCS) pratik olarak bilinen tüm dilleri temsil etmek için gereken karakterler.

Unicode repertuarındaki her karaktere bir Ad ve Numara ( Karakter Kodu veya Kod Noktası ) atar.

UTF-8 encoding , bu karakterleri dijital olarak bilgisayar belleğinde temsil etmenin bir yoludur. UTF-8, her kod noktasını bir sekizli dizisi (8 bit bayt) ile eşler

Örneğin,

UCS Karakteri = nicode Han Karakteri

UCS kod noktası = U + 24B62

UTF-8 kodlaması = F0 A4 AD A2 (altıgen) = 11110000 10100100 10101101 10100010 (kutu)

29
nightlytrails

nicode bu karakter kümesini kodlamak için bir karakter kümesini ( UCS ) ve kodlamaları ( UTF ) tanımlayan bir standarttır. Ancak genel olarak, Unicode, standart değil karakter setine atıfta bulunur.

Oku Mutlak Minimum Her Yazılım Geliştiricisi Kesinlikle Kesinlikle, Unicode ve Karakter Kümeleri Hakkında Bilmeniz Gerekenler (Mazeret Yok!) ve 5 Dakikada Unicode .

24
Gumbo

Mevcut cevaplar zaten birçok detayı açıklıyor, fakat işte en doğrudan açıklama ve örnekle çok kısa bir cevap.

Unicode, karakterleri kod noktalarına eşleyen standardıdır .
Her karakterin 9731 gibi bir sayıya sahip benzersiz bir kod noktası (kimlik numarası) vardır.

UTF-8 bir   kod noktalarının kodlaması .
Tüm karakterleri diskte (bir dosyada) saklamak için UTF-8, karakterleri 4 oktete (8 bit dizileri) - bayta böler. UTF-8, çeşitli kodlamalardan biridir (verileri temsil etme yöntemleri). Örneğin, Unicode'da (ondalık) kod noktası 9731, UTF-8'de 3 bayttan oluşan bir kardan adam () temsil eder: E2 98 83

İşte bir bazı rastgele örneklerle sıralı liste .

21
basic6

1. Unicode

Dünyada "$, &, h, a, t,?, 张, 1, =, + ..." gibi birçok karakter var.

Sonra bu karakterlere adanmış bir organizasyon var.

"Unicode" denilen bir standart yaptılar.

Standart aşağıdaki gibidir:

  • her pozisyonun "kod noktası" veya "kod pozisyonu" olarak adlandırıldığı bir form oluşturun.
  • Tüm pozisyonlar U + 0000 ila U + 10FFFF arasındadır;
  • Şimdiye kadar, bazı pozisyonlar karakterlerle doldurulur ve diğer pozisyonlar kaydedilir veya boştur.
  • Örneğin, "U + 0024" konumu "$" karakteriyle doldurulur.

Not: Tabii ki ISO adlı başka bir standardı koruyan başka bir organizasyon var - "ISO 10646" - neredeyse aynı.

2. UTF-8

Yukarıdaki gibi, U + 0024 sadece bir konumdur, bu yüzden "U + 0024" ü bilgisayarda "$" karakteri için kaydedemeyiz.

Bir kodlama yöntemi olmalı.

Sonra UTF-8, UTF-16, UTF-32, UCS-2 gibi kodlama yöntemleri geliyor.

UTF-8 uyarınca, "U + 0024" kod noktası 00100100 olarak kodlanmıştır.

00100100, "$" için bilgisayara kaydettiğimiz değerdir.

15
wengeezhang

Gumbo'nun cevabındaki bağlantıları kontrol ettim ve bu parçaların bir kısmını buraya Stack Overflow'ta da yapıştırmak istedim.

“... Bazı insanlar, Unicode'un sadece her bir karakterin 16 bit aldığı 16 bitlik bir kod olduğu ve bu nedenle 65.536 olası karakter olduğu gibi yanlış algılanıyor. Bu, aslında doğru değil. Unicode hakkındaki en yaygın efsanedir. Eğer öyleyse, bunu kötü hissetme.

Aslında, Unicode'un karakterleri düşünmenin farklı bir yolu vardır ve Unicode'un bir şeyleri düşünme şeklini veya hiçbir şeyin bir anlamı olmayacağını anlamalısınız.

Şimdiye kadar, bir harfin diskte veya bellekte saklayabileceğiniz bazı bitlerle eşleştiğini varsaydık:

A -> 0100 0001

Unicode'da, bir mektup hala teorik bir kavram olan kod noktası denilen bir şeye eşlenir. Bu kod noktasının bellekte veya diskte nasıl temsil edildiğine dair başka bir hikaye… "

“... Her alfabedeki her platonik mektuba, Unicode konsorsiyumu tarafından bu şekilde yazılmış sihirli bir sayı atanır: U + 0639. Bu sihirli sayıya kod noktası adı verilir. U +“ Unicode ”anlamına gelir ve sayılar onaltılıktır. U + 0639 Arap harfli Ain. İngilizce harf A ise U + 0041 .... "

“... Tamam, öyleyse bir dizemiz var:

Merhaba

unicode'da bu beş kod noktasına karşılık gelir:

U + 0048 U + 0065 U + 006C U + 006C U + 006F.

Sadece bir demet kod noktası. Sayılar, gerçekten. Bunu hafızada nasıl saklayacağımız ya da bir e-posta mesajında ​​nasıl temsil edeceğimiz hakkında henüz bir şey söylemedik ... "

“... Kodlamaların girdiği yer.

İki bayt hakkındaki efsaneye yol açan Unicode kodlaması için en eski fikir, hey, bu sayıları her biri iki bayt olarak depolayalım. Yani Merhaba olur

00 48 00 65 00 6C 00 6C 00 6F

Sağ? Çok hızlı değil! O da olamaz mıydı:

48 00 65 00 6C 00 6C 00 6F 00? ..."

12
kommradHomer

nicode, 130.000'den fazla karakter tanımlayan ve her birine sayısal bir kod ("kod noktası") tahsis eden geniş kapsamlı bir standarttır. Ayrıca, bu metnin nasıl sıralanacağı, normalleştirileceği, büyük/küçük harf değiştirileceği gibi kurallar da tanımlanmaktadır. Unicode'daki bir karakter, sıfırdan 0x10FFFF'a kadar bir kod noktasıyla gösterilir, ancak bazı kod noktaları saklanır ve karakterler için kullanılamaz.

Unicode'daki kodlar birden fazla kodlamayla gösterilebilir. En basit olanı, kod noktasını 32 bit tam sayı olarak kodlayan UTF-32'dir ve her biri 4 bayt genişliğindedir.

TF-8 başka bir kodlama ve hızlı bir şekilde fiili standart haline geliyor. Bir bayt değer dizisi olarak kodlar. Her kod noktası değişken bu sayıda bayt kullanabilir. ASCII aralığındaki kod noktaları ASCII ile uyumlu olması için çıplak olarak kodlanmıştır. Bu aralığın dışındaki kod noktaları, içinde bulundukları aralığa bağlı olarak 2, 3 veya 4 değişken bayt kullanır.

UTF-8 bu özellikler göz önünde bulundurularak tasarlanmıştır:

  • ASCII karakterleri tam olarak ASCII'deki gibi kodlanır, öyle ki ASCII dizesi UTF-8 olarak da geçerli olur.

  • İkili sıralama: Saf bir ikili sıralama kullanarak UTF-8 dizelerini sıralamak, hala tüm kod noktalarının sayısal sırada sıralanmasına neden olur.

  • ASCII aralığının dışındaki karakterler, ASCII aralığındaki herhangi bir baytı kullanmaz ve böylece ASCII karakteriyle karıştırılmayacaklarını garanti eder. Bu aynı zamanda bir güvenlik özelliğidir.

  • UTF-8, bir validator tarafından kolayca doğrulanabilir ve diğer karakter kodlamalarından ayırt edilebilir. Diğer 8 bitlik veya çok baytlı kodlamalardaki metinler nadiren UTF-8 olarak da doğrulanır.

  • Rastgele erişim: UTF-8 dizesinin herhangi bir noktasında, o konumdaki baytın bir karakterin ilk baytı olup olmadığını söylemek ve bu karakterin başlangıcına, hiçbir şeye başvurmaya gerek kalmadan geri dönmek mümkündür. dizenin başlangıcı.

3
thomasrutter

Onlar aynı şeyler, değil mi?

Hayır, değil.


Bence atıfta bulunduğun ilk cümle Wikipedia sayfası Güzel, kısa bir özet verir

UTF-8, bir ila dört 8 bit bayt kullanarak Unicode'daki tüm 1.112.064 geçerli kod noktalarını kodlayabilen değişken genişlikli bir karakter kodlamasıdır.

Ayrıntılı olarak:

  • Unicode , kodunu karakterlerden sayılara kodunu tanımlayan bir standarttır. puan , (aşağıdaki örnekte olduğu gibi). Tam haritalama için, bir göz atabilirsiniz burada .

    ! -> U+0021 (21),  
    " -> U+0022 (22),  
    \# -> U+0023 (23)
    
  • UTF-8, bu kod noktalarını bir bilgisayarın anlayabileceği bir biçimde , aka bit olarak kodlamanın yollarından biridir. Başka bir deyişle, bu kod noktalarının her birini bir bit dizisine dönüştürmenin veya bir bit dizisini eşdeğer kod noktalarına dönüştürmenin bir yolu/algoritmasıdır. Unicode için birçok alternatif kodlamanın bulunduğunu unutmayın.


Joel gerçekten Güzel bir açıklama ve tarihin bir bakışını verir burada .

1
Dimos

Bu konudan ne topladığımı özetleyebilirsem:

Unicode 'çevirir' sıra sayıları karakterleri (ondalık biçimde).

à = 224

UTF-8, 'çeviren' bir kodlamadır bu sayılar ikili sayıya gösterimler .

224 = 11000011 10100000
0
Raimi bin Karim

TF-8, 8 bit dizileri kullanan Unicode karakterleri kodlamak için bir yöntemdir.

nicode, birçok dilden çok çeşitli karakterleri temsil etmek için kullanılan bir standarttır.

0
akaMahesh