it-swarm.asia

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

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

UTF-8, "ASCII karakterlerinin" ötesinde karakter desteği avantajına sahiptir. Bu durumda, neden hiç ASCII UTF-8 üzerinden kodlamayı seçelim?

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

96
Pacerier

Bazı durumlarda, tek tek karakterlere erişimi hızlandırabilir. Dize hayal edin str='ABC' UTF8'de ve ASCII (ve dilin/derleyicinin/veritabanının kodlamayı bildiğini varsayarak)

Birçok programlama dilinde bulunan dizi erişim operatörünü kullanarak bu dizeden üçüncü (C) karaktere erişmek için c = str[2].

Dize ASCII kodlanmışsa, tek yapmamız gereken dizeden üçüncü bayt getirmektir.

Bununla birlikte, dize UTF-8 kodluysa, önce ilk karakterin bir veya iki baytlık karakter olup olmadığını kontrol etmeliyiz, daha sonra ikinci karakter üzerinde aynı kontrolü yapmamız gerekir ve ancak üçüncü karaktere erişebiliriz. Performans farkı ne kadar büyük olursa dize o kadar uzun olur.

Bu, örneğin bir UTF-8 kodlu VARCHAR 'after' yerleştirilmiş bir sütunun başlangıcını bulmak için bazı veritabanı motorlarında bir sorundur, veritabanının sadece VARCHAR alanında kaç karakter olduğunu kontrol etmesi gerekmez. her birinin kullandığı bayt sayısı.

85
Mchl

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

ABD-ASCII karakter kümesinin ötesine gidecek ve tipik batı Avrupa dillerinde kullanılan aksanlar, işaretler vb. Karakterleri kullanacaksanız, bir fark var - bunların çoğu hala olabilir ISO 8859'da tek bir baytla kodlanır, ancak UTF-8'de kodlandığında iki veya daha fazla bayt gerekir. Tabii ki dezavantajları da vardır: ISO 8859, kullanılan kodlamayı belirtmek için bant dışı araçlardan bazılarını kullanmanızı gerektirir ve bu dilleri aynı anda yalnızca bir destekler. Örneğin, Kiril (Rusça, Belarusça, vb.) Alfabesinin tüm karakterlerini yalnızca bir baytlık bir parça kullanarak kodlayabilirsiniz, ancak bunları Fransızca veya İspanyolca karakterlerle (US-ASCII'dekiler hariç) karıştırmak istiyorsanız/karıştırmak istiyorsanız/ISO 646 alt kümesi) neredeyse hiç şansınız kalmamıştır - bunu yapmak için karakter setlerini tamamen değiştirmeniz gerekir.

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ı kodlamalar kullanmanız gerekir. Bunlardan bazıları (ör. Japonca için Shift JIS), başa çıkmak için mutlak bir acıdır. Onları desteklemek isteyebileceğiniz herhangi bir şans varsa, her ihtimale karşı Unicode'u kullanmanın değerli olduğunu düşünürdüm.

7
Jerry Coffin

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

Belki ASCII) düşünüyordunuz. Yani herhangi bir geçerli ASCII akışı da geçerli bir UTF-8 Akış.

8 bitlik karakter setlerini düşünürseniz, çok önemli bir avantaj, temsil edilebilir tüm karakterlerin tam olarak 8 bit olması, UTF-8'de 24 bite kadar olabilmeleridir.

5
user1249

Evet, ASCII'nin anlamlı olduğu bazı kullanım durumları vardır: dosya biçimleri ve ağ protokolleri . Özellikle, aşağıdaki durumlarda kullanım için:

  • Bilgisayar programları tarafından oluşturulan ve tüketilen, asla son kullanıcılara sunulmayan verileriniz var;
  • Ancak bu, programcıların okuyabilmesi, geliştirme ve hata ayıklama kolaylığı için yararlıdır.

Kodlama olarak ASCII kullanarak, en az bir miktar okunabilirliği korurken çok baytlı kodlamanın karmaşıklığını önlersiniz.

Birkaç örnek:

  • HTTP sekizli diziler olarak tanımlanan bir ağ protokolüdür, ancak bunların _'e karşılık gelmesi çok yararlıdır (en azından İngilizce konuşan programcılar için)ASCII "GET", "POST", "Accept-Language" vb. Gibi kelimelerin kodlanması.
  • PNG resim biçimindeki yığın türleri dört sekizli içerir, ancak IDAT "görüntü verileri" anlamına gelen bir PNG kodlayıcı veya kod çözücü programlıyorsanız ve PLTE "palet" anlamına gelir.

Tabii ki verilerin gerçekten son kullanıcılara sunulmayacağına dikkat etmelisiniz, çünkü eğer görünür hale gelirse (olduğu gibi) URL'ler olması durumunda), kullanıcılar haklı olarak bu verilerin okuyabilecekleri bir dilde olmasını beklerler.

3
Gareth Rees

Her şeyden önce: başlığınızda/d ANSI kullanılırken, metinde ASCII'ye atıfta bulunulur. ANSI'nin ASCII'ye eşit olmadığını lütfen unutmayın. ANSI ASCII setini içerir, ancak ASCII set ilk 128 sayısal değer (0 - 127) ile sınırlıdır.

Tüm verileriniz ASCII (7 bit) ile sınırlandırılmışsa, hem ANSI hem de UTF-8'in tam olması nedeniyle UTF-8, ANSI veya ASCII kullanmanız önemli değildir = ASCII set. Başka bir deyişle: 0 ile 127 arasında olan sayısal değerler ASCII, ANSI ve UTF-8'de tamamen aynı karakterleri temsil eder.

ASCII setinin dışında 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. Bu makine farklı kod sayfalarını kullanmak üzere ayarlandıysa, nnn sayısal değeri bu kod sayfalarındaki farklı karakterleri temsil ettiğinden, A makinesinde ve B makinesinde okuyun komik görünümlü metinler üretebilir/üretebilir.

Bu "kod sayfası cehennemi" nicode standardı tanımının nedenidir. UTF-8, 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.

Bu nedenle, ASCII setinin 128 karakterini aşan bir şeyi desteklemeniz gerekiyorsa, tavsiyem TF-8 ile gitmek. ve kullanıcılarınızın sistemlerini hangi kod sayfası ile ayarladıkları konusunda endişelenmenize gerek yoktur.

2
Marjan Venema