Base128 neden kullanılmıyor? [kapalı]


90

Web üzerinden ikili verileri iletmek için neden base128 yerine yalnızca base64 kullanılıyor? ASCII karakter kümesinin 128 karakteri vardır, bu da teoride temel 128'i temsil edebilir, ancak çoğu durumda yalnızca base64 kullanılır, ancak base128 kullanılmaz.


60
Neden temel 256 bile olmasın?
Gumbo

22
Bence asıl mesele yazdırılabilir karakterlere sahip olmaktır (64'ten fazlası olmasına rağmen ...)
Felix Kling

29
Sanırım taban 128 bize aitti. 64 üssünü korumakla görevlendirilen takım hala direniyor.
Ritch Melton

5
bu soru neden javascript'e özgü? bu, web'de kullanılan diğer dillerin çoğu için de geçerlidir, değil mi?
Benedikt Waldvogel

5
@KenRockot: 15 bitlik karakterlerinden bazılarının 3 bayta kodlanacağını anladığınızı görüyorum. Temel 2048 kodlamanız, 11 biti 2 bayta paketlemek anlamına gelir, bu da bayt başına 5.5 bit yapar - taban 64'ün yarısı biraz daha azdır.
maaartinus

Yanıtlar:


105

Sorun, ASCII karakter setinin en az 32 karakterinin, alıcı terminal tarafından yorumlanabilen "kontrol karakterleri" olmasıdır. Örneğin, alıcı terminali zili yapan BEL (çan) karakteri var. Tam olarak adlarının ima ettiği şeyi yapan SOT (İletimin Başlangıcı) ve EOT (İletimin Sonu) karakterleri vardır. Veri yapılarının bir akışta nasıl serileştirildiği / düzleştirildiği konusunda özel anlamları olabilecek CR ve LF karakterlerini de unutmayın .

Adobe , ASCII karakter setinde daha fazla karakter kullanmak için Base85 kodlamasını yarattı , ancak AFAIK, patentlerle korunuyor.


7
Base91, iyi bir açık kaynak seçeneği gibi görünüyor: base91.sourceforge.net
Jorge Cevallos

2
2 gücünün bayt veriye daha kolay uyduğunu ve kodlamanın daha basit olduğunu düşünmeye değer. Sonra taşınabilirlik var; her dilin bir base64 kodlaması ve / veya bir base64 kod çözmesi vardır.
Lodewijk

5
Re Base85 ve Adobe : Verilen patent numaraları ve yıl belirtilirse cevap daha kullanışlı hale getirilebilir. Eğer patentler bir sorunsa btoa, her zaman , 1990'dan kalma, patentlerle sınırlandırılmamış ve her halükarda sona erecek olan her zaman vardır.
agc

65

Çünkü bu 128 karakterin bazıları yazdırılamaz (çoğunlukla kod noktası 0x20'nin altında olanlar). Bu nedenle, kablo üzerinden bir ip olarak güvenilir bir şekilde iletilemezler. Ve kod noktası 128'in üzerine çıkarsanız, sistemler arasında kullanılan farklı kodlamalar nedeniyle kodlama sorunları yaşayabilirsiniz.


8
Base94 burada github'da var, 94 yazdırılabilir ASCII karakterinin tamamını kullanıyor: gist.github.com/iso2022jp/4054241
intrepidis

15

Diğer cevaplarda da belirtildiği gibi, kilit nokta karakter setini yazdırılabilir olanlara indirgemektir . Daha verimli bir kodlama şeması basE91'dir çünkü daha büyük bir karakter seti kullanır ve yine de düşük ASCII aralığında kontrol / boşluk karakterlerinden kaçınır. Web sayfası, ikili ile base64 ve basE91 kodlama verimliliğinin güzel bir karşılaştırmasını içerir .

Java uygulamasını bir kez temizledim. İnsanlar ilgilenirse, bunu GitHub'da yayınlayabilirim.

Güncelleme : Artık GitHub'da .


Java sürümüyle ilgilenirim
Michael Deardeuff,


12

İlk 32 karakterin kontrol karakteri olmasının kesinlikle hiçbir ilgisi yoktur, çünkü 128 karakter elde etmek için bunları kullanmak zorunda değilsiniz. 256 karakterimiz var ve sadece ilk 32'si kontrol karakteridir. Bu, 192 karakter bırakır ve bu nedenle, kontrol karakterleri kullanılmadan 128 tamamen mümkündür.

Nedeni şudur: Aynı görünecek ve nerede olursa olsun kopyalayıp yapıştırabileceğiniz bir şey olmalı. Bu nedenle, herhangi bir forumda, sohbette, e-postada vb. Aynı şekilde görüntülenecek karakterler olmalıdır. Bu, bir forum / sohbet / e-posta istemcilerinin genellikle biçimlendirme veya göz ardı etmek için kullanabileceği karakterleri kullanamayacağımız anlamına gelir. Ayrıca yazı tipi, dil ve bölgesel ayarlardan bağımsız olarak aynı karakterler olmalıdır.

Nedeni bu!


7
Kontrol karakterleri önemlidir çünkü hemen hemen herkes, sizin fikrinizin mümkün olduğunca kod sayfası / kodlama nötr olması gerektiğini varsayıyordu. Bu, sizi mutlaka ilgili kodlamaların çoğunun bir alt kümesi olan (7 bit) ASCII ile sınırlar. Ayrıca internetin tamamı 8-bit temiz değildir ve çoğu ASCII'dir. Demek istediğin, yapmaya değer.
Tim Seguine

7
Sadece eklemek için: ASCII yalnızca 128 karakteri tanımlar. # 255 Karakterler # 128 olan değil ASCII tanımladı. Soru, "herhangi bir 8-bit kodlamaya" değil, açıkça ASCII'ye başvurduğundan, tüm yanıtlar kendilerini ASCII kümesinin 128 karakteriyle sınırlar.
pepoluan

Örnek olarak en yaygın UTF-8 kodlamasını kullanırsak: 128'den 196'ya kadar baytlar anında UTF8 kod çözme hatalarına yol açar; 196'dan 256'ya kadar baytlar, sonraki baytın da aynı karakterde olduğu anlamına gelir, ancak sonraki bayt 128'in altında olursa, yine UTF8 kod çözme hatalarına neden olur. Bununla birlikte, neredeyse tüm karakter kodlamaya duyarlı diller, base64 kitaplığının base64 dizelerini UTF8 güvenli dizeler olarak almasını sağlar. UTF8 güvenli dizge olarak kodlanamadığından, aynı şey base128 ile yapılamaz.
SOFe

10

Base64 yaygındır çünkü çeşitli sorunları çözer (aklınıza gelebilecek neredeyse her yerde çalışır)

  • Aktarımın 8 bit temiz olup olmadığı konusunda endişelenmenize gerek yok.

  • Kodlamadaki tüm karakterler yazdırılabilir. Sen edebilirsiniz bkz onları. Bunları kopyalayıp yapıştırabilirsiniz . Bunları URL'lerde (belirli varyantlarda) kullanabilirsiniz. vb.

  • Sabit kodlama boyutu. mBaytların her zaman nbaytlara kodlanabileceğini biliyorsunuz .

  • Herkes bunu duydu - yaygın olarak destekleniyor, çok sayıda kitaplık ve birlikte çalışması çok kolay.

Base128'in tüm bu avantajları yoktur.

Görünüşe göre 8 bit temiz - ancak base64'ün 65 sembol kullandığını hatırlayın. Bant dışı bir karakter olmadan sabit bir kodlama boyutunun avantajlarına sahip olamazsınız. Bant dışı bir karakter kullanırsanız, artık 8 bitlik temiz olamazsınız.

Yine de hepsi olumsuz değil.

  • base128'i kodlamak / kodunu çözmek base64'e göre daha kolaydır - yalnızca vardiya ve maskeler kullanırsınız. Gömülü uygulamalar için önemli olabilir

  • base128, mevcut bitlerin çoğunu kullanarak aktarımın base64'ten biraz daha verimli kullanımını sağlar.

İnsanlar yapmak kullanımı base128 - Ben şimdi bir şey için kullanıyorum. Bu kadar yaygın değil.


Ayrıca posta / haber sistemlerinin ve bunların ilklerinin (ve ayrıca XML'in) her zaman ilk 32 kod noktasına karşı nazik olmadığını unutmayın (örneğin, CR LF ve LF'yi düşünün), ancak aksi takdirde cevabınız çok iyi görünür.
SamB

"bu base64 65 sembol kullanıyor." => yazım hatası mı yoksa bir şey mi kaçırdım?
Kikiwa

@Kikiwa, wikipedia'daki şu java örneğine bakın . CODESDeğişkenin uzunluğunu kontrol edin .
John La Rooy

Oh evet, dolgu karakteri '=' yalnızca kodlama yükünün sonunda, haklısınız, teşekkürler.
Kikiwa

4

Emin değilim, ancak daha düşük değerlerin (kontrol kodlarını veya başka bir şeyi temsil eden) HTTP istekleri / yanıtları içinde metin / karakterler olarak güvenilir bir şekilde aktarılmadığını düşünüyorum ve 127'nin üzerindeki değerler yerel / kod sayfası / belirli bir şey olabilir, bu yüzden yoktur Tüm tarayıcılarda / platformlarda çalışması beklenebilecek 128 farklı karakter.


3

esaji haklı. Base64, yalnızca metin bekleyen bir protokol kullanarak iletim için ikili verileri kodlamak için kullanılır. Wiki girişinde doğru .


2

Base128 PHP-Class'a göz atın. ISO 8859-1 karakter setiyle kodlama ve kod çözme.

GoogleCode PHP-Sınıfı Base128


1
Bunun yerine utf-8 kullanmasını isterdim ...
Janus Troelsen

1
Temel kodlamanın temeldeki verilerle ilgisi yoktur. Metninizi / verilerinizi kodlamak için istediğiniz herhangi bir metin kodlamasını kullanabilirsiniz. Demek istediği, Base ## dizin tablosunun çeviri olarak ISO 8859-1 ASCII karakter kümesini kullandığıdır.
Çad

1
Metne temel olarak kodlanmış ikili verileri yerleştirmeye çalıştığınız anda bunun temeldeki verilerle bir ilgisi vardır . Bu metin başka bir kodlamayla kodlanmışsa, sorun yaşarsınız.
Stijn de Witt

"ISO 8859-1 ASCII" karakter kümesi diye bir şey yoktur. Program, verileri 128 farklı yazdırılabilir ISO 8859-1 karakter kullanarak kodlar. ASCII'yi hiçbir şekilde, biçimde veya biçimde kullanmaz.
Nisse Engström
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.