Unicode kodlamalarının karşılaştırılması - Comparison of Unicode encodings - Wikipedia

Bu makale karşılaştırır Unicode kodlamalar. İki durum dikkate alınır: 8 bit temiz kullanımının yasaklandığı ortamlar ve ortamlar bayt yüksek bit setine sahip değerler. Başlangıçta bu tür yasaklar, yalnızca yedi veri biti kullanan bağlantılara izin veriyordu, ancak bunlar standartlarda kalıyor ve bu nedenle yazılım, kısıtlamalara uyan mesajlar üretmelidir. Unicode için Standart Sıkıştırma Şeması ve Unicode için İkili Sıralı Sıkıştırma Karşılaştırma tablolarından çıkarılmıştır çünkü boyutlarını basitçe ölçmek zordur.

Uyumluluk sorunları

Bir UTF-8 sadece içeren dosya ASCII karakterler bir ASCII dosyasıyla aynıdır. Eski programlar, ASCII olmayan karakterler içerse bile genellikle UTF-8 kodlu dosyaları işleyebilir. Örneğin, C printf işlev, bir biçimlendirme dizesini tanımlamak için yalnızca ASCII '%' karakterini aradığından ve diğer tüm baytları değiştirmeden yazdırdığından, ASCII olmayan karakterler değiştirilmeden çıktılanacağından, bir UTF-8 dizesi yazdırabilir.

UTF-16 ve UTF-32 ASCII dosyalarıyla uyumlu değildir ve bu nedenle Unicode -dosyanın yalnızca ASCII alt kümesinde karakterler içerdiği bilinse bile, bunları görüntülemek, yazdırmak ve işlemek için programlar. Birçok sıfır bayt içerdikleri için, dizeler normal tarafından değiştirilemez. boş sonlu dize kopyalama gibi basit işlemler için bile kullanım.

Bu nedenle, çoğu UTF-16 sisteminde bile pencereler ve Java, UTF-16 metin dosyaları yaygın değildir; ASCII gibi eski 8 bit kodlamalar veya ISO-8859-1 hala Unicode desteğinden vazgeçilmektedir; veya UTF-8, Unicode için kullanılır. Nadir bir karşı örnek, tarafından kullanılan "dizeler" dosyasıdır. Mac OS X (10.3 ve sonraki sürümler) varsayılan olarak UTF-16 olan, "UTF-8 kullanılarak kodlanmış dosyalar ... çalışacakları garanti edilmez" uluslararası hale getirilmiş mesaj sürümlerinin aranması için uygulamalar.[1]

XML varsayılan olarak UTF-8 olarak kodlanmıştır ve tüm XML işlemcileri en azından UTF-8 (tanım gereği US-ASCII dahil) ve UTF-16'yı desteklemelidir.[2]

Verimlilik

UTF-8 8, 16, 24 veya 32 bit gerektirir (birden dörde kadar bayt ) bir Unicode karakterini kodlamak için, UTF-16 bir karakteri kodlamak için 16 veya 32 bit gerektirir ve UTF-32 bir karakteri kodlamak için her zaman 32 bit gerektirir. İlk 128 Unicode kod noktaları, U + 0000 ile U + 007F arası, C0 Kontrolleri ve Temel Latince ASCII kod eşdeğerlerine bire bir karşılık gelen karakterler, UTF-8'de 8 bit, UTF-16'da 16 bit ve UTF-32'de 32 bit kullanılarak kodlanır.

Sonraki 1.920 karakter, U + 0080'den U + 07FF'ye (neredeyse tümünün geri kalanını kapsar) Latin alfabesi alfabesi, ve ayrıca Yunan, Kiril, Kıpti, Ermeni, İbranice, Arapça, Süryanice, Tāna ve N'Ko ), hem UTF-8 hem de UTF-16'da kodlamak için 16 bit ve UTF-32'de 32 bit gerektirir. U + 0800 - U + FFFF için, yani içindeki karakterlerin geri kalanı Temel Çok Dilli Düzlem (BMP, düzlem 0, U + 0000 - U + FFFF), dünyanın yaşayan dillerinin çoğunun karakterlerinin geri kalanını kapsar, UTF-8 bir karakteri kodlamak için 24 bite ihtiyaç duyarken, UTF-16 16 bit ve UTF'ye ihtiyaç duyar -32, 32'ye ihtiyaç duyar. Kod noktaları U + 010000 - U + 10FFFF, ek uçaklar (1-16 düzlemleri), UTF-8, UTF-16 ve UTF-32'de 32 bit gerektirir.

İçindeki tüm yazdırılabilir karakterler UTF-EBCDIC en azından UTF-8'de olduğu kadar çok bayt kullanın ve çoğu, C1 kontrol kodlarının tek bayt olarak kodlanmasına izin vermek için alınan bir karar nedeniyle daha fazlasını kullanır. Yedi bitlik ortamlar için, UTF-7 diğer Unicode kodlamalarının kombinasyonundan daha fazla alan verimlidir yazdırılabilir veya Base64 neredeyse tüm metin türleri için (bkz. "Yedi bit ortamlar " altında).

Depolama kullanımı

Her formatın, depolama verimliliği (ve dolayısıyla iletim süresi) ve işlem verimliliği açısından kendi avantajları ve dezavantajları vardır. Depolama verimliliği, Unicode içindeki konuma bağlıdır kod alanı herhangi bir metnin karakterlerinin ağırlıklı olarak nereden geldiği. Unicode kod alanı blokları karakter setine (yani alfabe / komut dosyası) göre düzenlendiğinden, herhangi bir metnin depolama verimliliği etkin bir şekilde alfabe / komut dosyası o metin için kullanılır. Bu nedenle, örneğin, UTF-8, U + 0000 ve U + 007F arasındaki 128 kod noktası için UTF-16'dan karakter başına bir daha az bayta (8'e karşı 16 bit) ihtiyaç duyar, ancak karakter başına bir bayta daha ihtiyaç duyar (24'e karşı 16 bit ) U + 0800 ile U + FFFF arasındaki 63.488 kod noktası için. Bu nedenle, U + 0000 ila U + 007F aralığında U + 0800 ila U + FFFF aralığındakinden daha fazla karakter varsa, UTF-8 daha verimlidir, daha azsa, UTF-16 daha fazladır. verimli. Sayılar eşitse, tam olarak aynı boyuttadırlar. Şaşırtıcı bir sonuç, yalnızca yüksek aralıkta karakter kullanan dillerde yazılmış gerçek dünya belgelerinin, boşlukların, rakamların, noktalama işaretlerinin, yeni satırların, html biçimlendirmesinin ve gömülü sözcüklerin yaygın kullanımı nedeniyle UTF-8'de genellikle daha kısa olmasıdır. Latin harfleriyle yazılmış kısaltmalar.[kaynak belirtilmeli ]

İşlem süresi

İşlem süresi söz konusu olduğunda, UTF-8 veya UTF-16 gibi değişken uzunluklu kodlamaya sahip metnin işlenmesi, kod birimi dizileriyle çalışmanın aksine, ayrı kod birimlerini bulma ihtiyacı varsa daha zordur. Arama, karakterlerin değişken boyutlu olup olmadığından etkilenmez, çünkü bir kod birimi dizisi araması bölümlerle ilgilenmez (kodlamanın kendi kendine senkronize olmasını gerektirir, ki hem UTF-8 hem de UTF-16'dır). Yaygın bir yanılgı, "bulmanın" gerekli olduğu ninci karakter "ve bunun sabit uzunlukta bir kodlama gerektirdiğini; ancak, gerçekte sayıyı kullanın n sadece incelenmesinden elde edilir n − 1 karakterler, bu nedenle yine de sıralı erişim gereklidir.[kaynak belirtilmeli ] UTF-16BE ve UTF-32BE vardır büyük adam, UTF-16LE ve UTF-32LE vardır küçük endian. Bir endian sırasındaki karakter dizileri farklı bir endian sırasına sahip bir makineye yüklendiğinde, veriler bir bayt ayrıntıyla işlenmedikçe (UTF-8 için gerektiği gibi), karakterlerin verimli bir şekilde işlenmeden önce dönüştürülmesi gerekir. Buna göre, eldeki mesele, hesaplama zorluğundan çok protokol ve iletişim ile ilgilidir.

İşleme sorunları

İşleme için, bir formatın aranması, kesilmesi ve genellikle güvenli bir şekilde işlenmesi kolay olmalıdır. Tüm normal Unicode kodlamaları bir tür sabit boyutlu kod birimi kullanır. Biçime ve kodlanacak kod noktasına bağlı olarak, bu kod birimlerinden biri veya daha fazlası bir Unicode'u temsil edecektir. kod noktası. Kolay arama ve kesmeye olanak sağlamak için, bir dizi, daha uzun bir dizi içinde veya diğer iki dizinin sınırları boyunca gerçekleşmemelidir. UTF-8, UTF-16, UTF-32 ve UTF-EBCDIC bu önemli özelliklere sahiptir ancak UTF-7 ve GB 18030 yapamaz.

Sabit boyutlu karakterler yardımcı olabilir, ancak kod noktası başına sabit bir bayt sayısı olsa bile (UTF-32'de olduğu gibi), görüntülenen karakter başına sabit bir bayt sayısı yoktur. karakterleri birleştirmek. Bu uyumsuzlukları ve farklı kodlama şemaları arasındaki diğer tuhaflıkları göz önünde bulundurarak, unicode verilerinin arayüzler boyunca ve arayüzler boyunca aynı (veya uyumlu) protokolle işlenmesi (örneğin bir API / kitaplık kullanarak, istemci / sunucu modelinde unicode karakterlerin işlenmesi vb.) aynı anda olası bir hata kaynağını ortadan kaldırırken tüm ardışık düzeni basitleştirin.

UTF-16 popülerdir çünkü birçok API Unicode'un 16-bit sabit genişlikte olduğu zamana dayanır. Ancak, UTF-16 kullanmak, Temel Çok Dilli Düzlem kullanımıyla ilgili göz ardı riskini artıran özel bir durum. Bununla birlikte, vekil çiftleri yanlış yöneten programların muhtemelen dizileri birleştirmede problemleri vardır, bu nedenle UTF-32'nin kullanılması, çoklu kod birimi karakterlerinin kötü işlenmesi sorununu çözmesi olası değildir.

Depolanan verilerden herhangi biri UTF-8 ise (dosya içerikleri veya adları gibi), API olarak UTF-16 veya UTF-32 kullanan bir sistem yazmak çok zordur. Bunun nedeni, UTF-8 tarafından kullanılan bayt dizisinin fiziksel olarak geçersiz diziler içerebileceği gerçeğinden kaynaklanmaktadır. Örneğin, geçersiz bir UTF-8 dosya adını bir UTF-16 API kullanarak düzeltmek imkansızdır, çünkü olası hiçbir UTF-16 dizesi bu geçersiz dosya adına çevrilmeyecektir. Bunun tersi doğru değildir: geçersiz UTF-16'yı benzersiz (teknik olarak geçersiz olsa da) UTF-8 dizesine çevirmek önemsizdir, böylece bir UTF-8 API hem UTF-8 hem de UTF-16 dosyalarını ve adlarını kontrol ederek UTF yapabilir -8 bu tür karışık ortamlarda tercih edilir. UTF-16 sistemleri tarafından kullanılan talihsiz ancak çok daha yaygın bir çözüm, UTF-8'i aşağıdaki gibi başka bir kodlama olarak yorumlamaktır. CP-1252 ve görmezden gel Mojibake ASCII olmayan veriler için.

İletişim ve depolama için

UTF-16 ve UTF-32'de yok endianness tanımlı olduğundan, bayt odaklı bir ağ üzerinden alırken veya bayt yönelimli bir depolamadan okurken bir bayt sırası seçilmelidir. Bu, bir bayt sırası işareti metnin başında veya big-endian varsayıldığında (RFC 2781 ). UTF-8, UTF-16BE, UTF-32BE, UTF-16LE ve UTF-32LE tek bir bayt sırasına göre standartlaştırılmıştır ve bu problemi yoktur.

Bayt akışı tabi ise yolsuzluk sonra bazı kodlamalar diğerlerinden daha iyi iyileşir. UTF-8 ve UTF-EBCDIC, sonraki kod noktasının başlangıcında bozuk veya eksik bir bayttan sonra her zaman yeniden senkronize edebildikleri için bu açıdan en iyisidir; GB 18030, bir sonraki ASCII olmayan numaraya kadar kurtarılamaz. UTF-16 işleyebilir değişmiş bayt, ancak tek sayı değil eksik baytlar, bu aşağıdaki tüm metni karıştırır (yine de yaygın olmayan ve / veya atanmamış karakterler üretecektir). Eğer bitler yanlış bayt sınırları birkaç bayttan daha uzun metinde geçersiz UTF-8 üreteceğinden, UTF-8 yeniden senkronize edilebilirse de, bunların tümü aşağıdaki metni karıştıracaktır.

Detayda

Aşağıdaki tablolar, farklı Unicode aralıkları için kod noktası başına bayt sayısını listelemektedir. Gerekli ek yorumlar tabloya dahil edilmiştir. Rakamlar, metin bloğunun başındaki ve sonundaki genel giderlerin ihmal edilebilir olduğunu varsaymaktadır.

N.B. Aşağıdaki tablolar, kod noktası, değil kullanıcı başına görünür "karakter" (veya "grafeme kümesi"). Tek bir grafem kümesini tanımlamak için birden fazla kod noktası gerekebilir, bu nedenle UTF-32'de bile dizeleri bölerken veya birleştirirken dikkatli olunmalıdır.

Sekiz bitlik ortamlar

Kod aralığı (onaltılık)UTF-8UTF-16UTF-32UTF-EBCDICGB 18030
000000 - 00007F12411
000080 - 00009F2Miras alınan karakterler için 2
GB 2312 /GBK (örneğin çoğu
Çince karakterler) 4 için
diğer her Şey.
0000A0 - 0003FF2
000400 - 0007FF3
000800 - 003FFF3
004000 - 00FFFF4
010000 - 03FFFF444
040000 - 10FFFF5

Yedi bit ortamlar

Bu tablo her özel durumu kapsamayabilir ve bu nedenle yalnızca tahmin ve karşılaştırma için kullanılmalıdır. Bir kodlamadaki metnin boyutunu doğru bir şekilde belirlemek için gerçek belirtimlere bakın.

Kod aralığı (onaltılık)UTF-7UTF-8 alıntı
yazdırılabilir
UTF-8 Base64UTF-16 q.-p.UTF-16 base64GB 18030 q.-p.GB 18030 base64
ASCII
grafik karakterler
(U + 003D "=" hariç)
"Doğrudan karakterler" için 1 (bazı kod noktaları için kodlayıcı ayarına bağlıdır), U + 002B "+" için 2, aksi takdirde 000080 - 00FFFF ile aynı11 1342 2311 13
00003D (eşittir işareti)363
ASCII
kontrol karakterleri:
000000 - 00001F
ve 00007F
Direktliğe bağlı olarak 1 veya 3Direktliğe bağlı olarak 1 veya 3
000080 - 0007FFTek baytlık karakterler dizisindeki yalıtılmış bir durum için 5. Koşular için2 23 tam bir bayt sayısı yapmak için karakter başına artı doldurma artı çalışmayı başlatmak ve bitirmek için iki62 23Bayt değerlerinin atlanması gerekip gerekmediğine bağlı olarak 2-6GB2312 / GBK'dan devralınan karakterler için 4–6 (ör.
çoğu Çince karakter) 8 diğer her şey için.
2 23 GB2312 / GBK'dan devralınan karakterler için (ör.
çoğu Çince karakter)5 13 diğer her şey için.
000800 - 00FFFF94
010000 - 10FFFFİzole durum için 8,5 13 karakter başına artı tamsayı artı 2 için doldurma125 13Vekillerin düşük baytlarının kaçılması gerekip gerekmediğine bağlı olarak 8-12.5 1385 13

Endianness boyutları etkilemez (UTF-16BE ve UTF-32BE aynı boyutta UTF-16LE ve UTF-32LE UTF-32'nin tırnaklı-yazdırılabilir altında kullanımı oldukça pratik değildir, ancak uygulanırsa, kod noktası başına 8-12 bayta (ortalama yaklaşık 10 bayt) neden olur, yani BMP için, her kod noktası tam olarak Alıntılanan yazdırılabilir / UTF-16'daki aynı koddan 6 bayt fazla. Base64 / UTF-32 alır5 13 bayt için hiç kod noktası.

Yazdırılabilir veya UTF-7 altındaki bir ASCII kontrol karakteri, doğrudan veya kodlanmış (çıkış karakterli) gösterilebilir. Belirli bir kontrol karakterinden kaçma ihtiyacı birçok duruma bağlıdır, ancak yeni satırlar metin verilerinde genellikle doğrudan kodlanır.

Sıkıştırma şemaları

BOCU-1 ve SCSU Unicode verilerini sıkıştırmanın iki yoludur. Onların kodlama metnin ne sıklıkla kullanıldığına bağlıdır. Çoğu metin dizisi aynı komut dosyasını kullanır; Örneğin, Latince, Kiril, Yunan ve benzeri. Bu normal kullanım, birçok metin çalışmasının kod noktası başına yaklaşık 1 bayta kadar sıkıştırılmasına izin verir. Bu durum bilgili kodlamalar, bir dizenin herhangi bir konumundaki metne rastgele erişmeyi zorlaştırır.

Bu iki sıkıştırma şeması, diğer sıkıştırma şemaları kadar verimli değildir. zip veya bzip2. Bu genel amaçlı sıkıştırma şemaları, daha uzun bayt çalıştırmalarını yalnızca birkaç bayta sıkıştırabilir. SCSU ve BOCU-1 sıkıştırma şemaları UTF-8, UTF-16 veya UTF-32 olarak kodlanmış metnin teorik% 25'inden fazlasını sıkıştırmayacaktır. Diğer genel amaçlı sıkıştırma düzenleri, orijinal metin boyutunun% 10'una kolayca sıkıştırabilir. Genel amaçlı şemalar, iyi bir sıkıştırma oranı için daha karmaşık algoritmalar ve daha uzun metin parçaları gerektirir.

Unicode Teknik Notu # 14 sıkıştırma şemalarının daha ayrıntılı bir karşılaştırmasını içerir.

Tarihsel: UTF-5 ve UTF-6

UTF-5 ve UTF-6 için teklifler yapılmıştır. alan adlarının uluslararasılaştırılması (IDN). UTF-5 teklifi bir 32 taban kodlama, nerede Zayıf kod (diğer şeylerin yanı sıra, tam olarak değil) 36 taban kodlama. İsim UTF-5 5 bitlik bir kod birimi için denklem 2 ile açıklanır5 = 32.[3] UTF-6 teklifi, burada UTF-5'e bir çalışma uzunluğu kodlaması ekledi 6 basitçe duruyor UTF-5 artı 1.[4] IETF IDN WG daha sonra daha verimli Zayıf kod bu amaç için.[5]

Ciddiye alınmamak

UTF-1 asla ciddi bir kabul görmedi. UTF-8 çok daha sık kullanılır.

UTF-9 ve UTF-18 işlevsel kodlamalar olmasına rağmen, 1 Nisan Şakası Günü RFC şaka özellikleri.

Referanslar

  1. ^ Apple Developer Connection: Uluslararasılaştırma Programlama Konuları: Dizeler Dosyaları
  2. ^ "Varlıklarda Karakter Kodlaması". Genişletilebilir İşaretleme Dili (XML) 1.0 (Beşinci Baskı). W3C. 2008.
  3. ^ Seng, James, UTF-5, bir Unicode ve ISO 10646 dönüştürme formatı, 28 Ocak 2000
  4. ^ Welter, Mark; Spolarich, Brian W. (16 Kasım 2000). "UTF-6 - Kimlik için Yine Başka Bir ASCII Uyumlu Kodlama". İnternet Mühendisliği Görev Gücü. Arşivlendi 23 Mayıs 2016 tarihinde orjinalinden. Alındı 9 Nisan 2016.
  5. ^ Geçmiş IETF IDN WG sayfası