UTF-8 üzerinden ASCII kodlamasını seçmenin avantajı nedir?


91

ASCII'deki tüm karakterler UTF-8 kullanılarak, depolamada bir artış olmadan kodlanabilir (her ikisi de depolama baytı gerektirir).

UTF-8, "ASCII karakterleri" nin ötesinde karakter desteğinin avantajına sahiptir. Bu durumda, neden hiç UTF-8 üzerinden ASCII kodlamasını seçelim?

UTF-8 yerine ASCII'yi seçeceğimizde bir kullanım durumu var mı?


9
Eski şeyleri desteklemek için ...
fretje

9
Yani UTF8 yasal olarak ASCII'yi de destekliyor. Bu nedenle, eski şeyleri desteklemeniz gerekse bile, UTF8 başka hiçbir değişiklik yapmadan işe yarayabilir.
Pacerier

3
Belki 8 ASCII karakterini 7 bayta paketleyen bir sistemle birlikte çalışmalısınız. İnsanlar herşeye uyacak çılgınca şeyler
yaptılar

4
Bana deli de, ama ben güvenlik ve istikrar derim. Çok baytlı dizileri olmayan bir karakter seti kırılması çok daha zordur. Beni yanlış anlama, insan dil desteği önemliyken ASCII bunu kesmeyecek. Ancak, sadece biraz temel programlama yapıyorsanız ve kendinizi derleyici ve işletim sisteminin yazıldığı ana dile çevirebilirseniz, neden karmaşıklığı ekleyelim? @Donal Fellows. Son baktığımda ... ASCII olduğunu 7 bayt. (Bu ekstra bit ile bir şey sadece ASCII değildir ve bela istiyor)
ebyrob

2
@ böylelikle Donal Fellows, 8 ascii sembolünü 7 bayta paketlemek anlamına gelir, çünkü her sembol her biri 7 bit kullanır ... 8 * 7 = 56 bit = 7 bayt. Bu sadece her 8’den 1 baytlık depolama alanını kurtarmak için özel bir kodlama ve kod çözme işlevi anlamına gelir.
dodgy_coder

Yanıtlar:


83

Bazı durumlarda, tek tek karakterlere erişimi hızlandırabilir. str='ABC'UTF8'de ve ASCII'de kodlanmış bir dize düşünün (ve dilin / derleyici / veritabanının kodlama hakkında bildiğini varsayarak)

CBu diziden üçüncü ( ) karakterine erişmek için, birçok programlama dilinde yer alan dizi erişim operatörünü kullanarak, böyle bir şey yaparsınız c = str[2].

Şimdi, eğer dizge ASCII kodlu ise, tek yapmamız gereken dizeden üçüncü byte almaktır.

Ancak, dize UTF-8 kodlu ise, önce ilk karakterin bir veya iki baytlık karakter olup olmadığını kontrol etmeliyiz, sonra ikinci karakterde aynı kontrolü yapmalıyız, ancak o zaman üçüncü karaktere erişebiliriz. Performanstaki fark daha büyük, daha uzun dizge olacaktır.

Bu, örneğin bir UTF-8 kodlu VARCHAR'dan sonra yerleştirilen bir sütunun başlangıcını bulmak için bazı veritabanı motorlarında örneğin, VARCHAR alanında ne kadar karakter olduğunu kontrol etmek zorunda değil, aynı zamanda her birinin kullandığı birçok bayt.


3
Eğer veritabanı hem "karakter sayısı" hem de "bayt sayısı" nı saklamazsa , bazı problemleri olduğunu söyleyebilirim ...
Dean Harding

1
TBH Her ikisini de saklayacak bir veritabanı bilmiyorum ...
Mchl

@Mchl: Veritabanının dizenin sonuna ulaştığını bildiğini nasıl hayal edersiniz?
kevin cline

1
Genellikle, 0x00 veya
0x0000

4
@DeanHarding Karakter sayısı, ikinci karakterin nerede başladığını size nasıl söyler? Veya veritabanı her karakter ofseti için de bir indeks tutmalı mı? Not: Yalnızca 2 karakter değildir, ancak en fazla 4 olabilir (6 olmadıkça) stackoverflow.com/questions/9533258/… . (Sisteminizi tahrip edebilecek çok uzun süren
düşmanlıkların

7

UTF-8'in yalnızca US-ASCII (veya ISO 646) alt kümesini kullanacaksanız, biri veya diğeri için gerçek bir avantaj yoktur; Aslında, her şey aynı şekilde kodlanmıştır.

US-ASCII karakter kümesinin ötesine geçecek ve (örneğin) tipik batı Avrupa dillerinde kullanılan aksan, umlaut vb. Karakterleri kullanacaksanız, o zaman bir fark var - bunların çoğu hala ISO 8859'da tek bir bayt ile kodlanır, ancak UTF-8'de kodlandığında iki veya daha fazla bayt gerektirir. Tabii ki, dezavantajları da vardır: ISO 8859, kullanılan kodlamayı belirtmek için bazı bant dışı araçlar kullanmanızı gerektirir ve yalnızca birini desteklerbir anda bu dillerin. Örneğin, Kiril (Rusça, Beyaz Rusya, vb.) Alfabesinin tüm karakterlerini yalnızca bir bayt parçasını kullanarak kodlayabilirsiniz, ancak bunları Fransızca veya İspanyolca karakterlerle karıştırmanız gerekirse / karıştırmanız gerekirse (US-ASCII’de olanlar hariç) / ISO 646 alt kümesi) Şansınız yaver gitti - bunu yapmak için karakter setlerini tamamen değiştirmeniz gerekiyor.

ISO 8859 gerçekten sadece Avrupa alfabeleri için kullanışlıdır. Çoğu Çince, Japonca, Korece, Arap vb. Alfabelerde kullanılan alfabelerin çoğunu desteklemek için, tamamen farklı bir kodlama kullanmanız gerekir. Bunlardan bazıları (örneğin, Japonca için Shift JIS) başa çıkmak için mutlak bir acı. Onları desteklemek isteyeceğiniz herhangi bir şans varsa, Unicode'u kullanmanın yararı olacağını düşünüyorum.


5

ANSI birçok konuda olabilir, çoğu bu konuda 8 bit karakter kümeleridir (Windows altında kod 1252 gibi).

Belki de 7-bit ve uygun bir UTF-8 alt kümesi olan ASCII'yi düşünüyordunuz. Herhangi bir geçerli ASCII akışı da geçerli bir UTF-8 akışıdır.

Eğer 8 bitlik karakter kümelerini düşünüyor olsaydınız, çok önemli bir avantaj, tüm gösterilebilir karakterlerin tam olarak 8 bittiği, UTF-8'de 24 bite kadar çıkabileceğidir.


evet, 7 bitlik ASCII setinden bahsediyorum. utf-8 yerine ascii olarak kaydetmemiz gereken 1 avantaj olduğunu düşünebilir misiniz? (7 bit yine de 8 bit olarak kaydedildiğinden, dosya boyutu tam olarak aynı olur)
Pacerier

1
Unicode değeri 127'den büyük karakterleriniz varsa, ASCII'ye kaydedilemezler.

1
@Pacerier: Herhangi bir ASCII dizesi bir UTF-8 dizesidir , bu nedenle fark yoktur . Kodlama yordamı , kullandığınız platformun dize olarak gösterilmesine bağlı olarak daha hızlı olabilir ; bununla birlikte, önemli bir hızlanma beklemiyorum, ancak esneklikte önemli bir kayba sahipsiniz.
back2dos

@Thor, bu yüzden ASCII olarak kaydetmenin tüm avantajları olup olmadığını soruyorum
Pacerier

5
@Pacerier, XML'yi ASCII olarak kaydederseniz, kullanmanız gereken, örneğin & # 160; kırılmaz bir alan için. Bu daha fazla doldurucu olmakla birlikte, verilerinizi UTF-8 kodlama hatalarına karşı ISO-Latin-1'e karşı daha dirençli yapar. Temel platformumuz karakterlerle görünmez bir sihir yaptığında yaptığımız şey budur. ASCII'de kalmak, verilerimizi daha sağlam kılar.

3

Evet, hala ASCII'nin mantıklı olduğu bazı durumlar var: dosya formatları ve ağ protokolleri . Özellikle, nerede kullanım için:

  • Bilgisayar programları tarafından üretilen ve tüketilen, hiçbir zaman son kullanıcılara sunulmayan verileriniz var;
  • Ancak, programcıların, okuma ve hata ayıklama kolaylığı için okuyabildikleri için faydalıdır.

Kodlama işleminiz olarak ASCII kullanarak, en azından bir miktar insan tarafından okunabilirliği koruyarak multi-byte kodlamanın karmaşıklığından kaçınırsınız.

Birkaç örnek:

  • HTTP , sekizli sekansları olarak tanımlanmış bir ağ protokolüdür, ancak bunların "GET", "POST", "Kabul Etme Dili" ve "Kabul Etme Dili" ve yakında.
  • PNG resim formatında öbek tipleri dört oktet oluşmaktadır, ancak bir PNG kodlayıcı veya kod çözücüye programladığınızı eğer kullanışlı IDAT"görüntü verilerini" anlamına gelir ve PLTE"paleti" anlamına gelir.

Elbette veri gerçekten dikkatli olmak gerekir değil o (URL'ler durumunda olduğu gibi) görülebilir, kullanıcılar haklı olarak veri olmasını bekliyoruz edeceğiz olmak biter çünkü eğer, son kullanıcılara sunulacaktır Bir dilde okuyabilirler.


İyi dedi. Gezegendeki en unicode'u ileten protokol olan HTTP'nin sadece ASCII'yi desteklemesi biraz ironik. (Aslında, aynı TCP ve IP, ikili destek, ASCII desteği için de aynı şey geçerli. Sanırım yığında tek ihtiyacınız olan şey bu)
ebyrob

2

Öncelikle: başlığınız / d ANSI kullanıyor, metinde ASCII'ye atıfta bulunuyorsunuz. Lütfen ANSI'nin ASCII'ye eşit olmadığını unutmayın. ANSI, ASCII setini içerir. Ancak ASCII seti ilk 128 sayısal değerle (0 - 127) sınırlıdır.

Tüm verileriniz ASCII (7 bit) ile sınırlandırılmışsa, hem ANSI hem de UTF-8 tam ASCII setini anlamadığından UTF-8, ANSI veya ASCII kullanmanız önemli değildir. Başka bir deyişle: 0'a kadar olan ve 127'yi kapsayan sayısal değerler ASCII, ANSI ve UTF-8'de aynı karakterleri temsil eder.

ASCII setinin dışındaki karakterlere ihtiyacınız varsa, bir kodlama seçmeniz gerekir. ANSI kullanabilirsiniz, ancak daha sonra tüm farklı kod sayfalarının sorunlarıyla karşılaşırsınız. A makinesinde bir dosya oluşturun ve B makinesinde okuyun, bu makineler farklı kod sayfalarını kullanmak için ayarlandıysa komik görünümlü metinler üretebilir / üretebilir, çünkü nnn sayısal değeri bu kod sayfalarındaki farklı karakterleri temsil eder.

Bu "kod sayfası cehennemi" Unicode standardının tanımlanmasının nedenidir . UTF-8 sadece bu standardın tek bir kodlamasıdır, çok daha fazlası vardır. UTF-16, Windows için yerel kodlama olduğu için en yaygın kullanılanıdır.

Öyleyse, ASCII setinin 128 karakterinin ötesindeki herhangi bir şeyi desteklemeniz gerekiyorsa, tavsiyem UTF-8 ile gitmektir . Bu şekilde farketmez ve kullanıcılarınızın sistemlerini hangi kod sayfasında kurdukları konusunda endişelenmenize gerek yoktur.


128 karakterin ötesinde bir desteğe ihtiyacım yoksa, UTF8 kodlaması üzerinden ACSII kodlamasını seçmenin avantajı nedir?
Pacerier

Kendinizi bu 128 karakterle sınırlamanın yanı sıra? Fazla değil. UTF-8, ASCII ve "yalnızca" ANSI gerektiren çoğu batı dilini karşılamak üzere özel olarak tasarlanmıştır. UTF-8'in yalnızca bir kaç byte ile daha az sayıda yüksek ANSI karakterini kodlayacağını göreceksiniz. HTML sayfalarının çoğunun varsayılan olarak UTF-8 kullanmasının bir nedeni vardır ...
Marjan Venema

1
@Pacerier, 127'nin üzerinde kodlamaya gerek duymuyorsanız, kodlamak / kod çözmek için bazı API kullandığınızda ASCII'yi seçmek faydalı olabilir, çünkü UTF aynı karakter olarak ek baytları göz önüne almak için ek bit doğrulamasına ihtiyaç duyar; sadece doğrulama olmadan 8 bit okuyan saf ASCII. Ancak ASCII'yi yalnızca büyük (büyük büyük) hesaplamalarda gerçekten yüksek bir optimizasyon seviyesine ihtiyacınız varsa ve bu optimizasyonda ne yaptığınızı biliyorsanız, öneririm. Değilse, sadece UTF-8 kullanın.
Luciano
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.