“Karakter seti” neden yaygın kullanımda gerçekten “kodlama” anlamına gelir?


10

Beni çok şaşırtan bir şey, çok fazla yazılımın eş anlamlı olarak "karakter kümesi" ve "kodlama" terimlerini kullanmasıdır.

İnsanlar bir unicode "kodlamasına" atıfta bulunduğunda, her zaman unicode karakterleri ASCII veya UTF-8 gibi bir bayt dizisi olarak temsil etmek için bir kural kümesi anlamına gelir. Bu makul ve sezgisel görünüyor; fikir, belirtilen kuralları kullanarak bu karakterleri bayt olarak "kodladığınız" dır.

Bu kural kümeleri bazen yalnızca tüm unicode karakterlerin bazı alt kümelerini "kodlama" yeteneğini sağladığından, "karakter kümesinin" kısaltması olan "karakter kümesinin" bir dizi unicode karakter anlamına geleceğini düşünebilirsiniz . bu karakterler kodlanır. Bu nedenle bir kodlama, bir karakter takımı (yalnızca 128 karakteri kodlamak için kuralları olan ASCII gibi bir kodlama, bu 128 karakterin karakter kümesiyle ilişkilendirilir), ancak bir karakter grubunun bir kodlama (örneğin UTF-8, UTF) içermesi anlamına gelir. -16 ve UTF-32'nin hepsi farklı kodlamalardır, ancak aynı karakter kümesini kodlayabilir).

Yine de - ve işte sorumun temel noktası - "charset" kelimesinin gerçek dünya kullanımı, kelimenin yapısının ima edeceği şeyle eşleşmiyor. Hemen hemen her zaman "kodlama" anlamında kullanılır.

Örneğin:

Bu meraklı (ab) dil kullanımı kaç yaşında ve bu 'sezgi' karşı-sezgisel tanımı nasıl ortaya çıktı? Belki de pratikte, kullanılan kodlamalar ile destekledikleri karakter kümeleri arasında birebir eşleme olduğu bir zamandan mı kaynaklanıyor ? Yoksa kelimenin bu tanımını belirleyen bazı etkili standartlar veya spesifikasyonlar var mıydı?


5
Kullanımı charseteskidir Unicode standardı, bu yüzden bir "bire-bir eşleme" olmayabilirdi ederken, bir belge için gerekli karakterler kodlama seçimi zorlamak eğiliminde. Ama kelimenin gerçek tarihini araştıracak zamanım yok ...
AmeliaBR

2
Birisi Unicode ile başlayıp alt kümeleri seçmiş gibi karakter kümelerinden "bir dizi Unicode karakter" olarak bahsediyorsunuz. Unicode'un icadından önce (veya en azından Unicode'un her yerde bulunmasından önce) birçok karakter setinin var olduğunu ve Unicode'un kasıtlı olarak bunların bir üst kümesi olarak inşa edildiğini söylemek daha doğrudur.
John Bartholomew

Yanıtlar:


3

Karakter kümeleri kavramı Unicode'dan daha eskidir.

Unicode'dan önce, bir karakter kümesi bir karakter kümesi ve her karakterin bit olarak nasıl temsil edildiğini tanımladı . Çoğu karakter kümesi bir karakteri bir bayta (256 karakter kümesine izin verir), bazıları iki bayta ve birkaçını (ASCII gibi) sadece 7 bite eşledi. Farklı karakter kümeleri genellikle aynı karaktere farklı değerler atadı ve kullanımdaki çeşitli karakter kümeleri arasında evrensel bir çeviri anahtarı yoktu.

Unicode, ortak bir "süper kümedeki" tüm karakter kümelerini birleştirerek bu sorunu çözme girişimiydi. Bu amaçla Unicode, örneğin kod noktası değerlerinden ayrı bir şey olarak karakter kodlamaları kavramı gibi bazı soyutlama düzeyleri ekledi. Bu, Unicode'un unicode öncesi karakter kümelerini unicode karakter kodlamaları olarak yeniden tanımlamasına izin verdi .

Örneğin HTML'deki charset özniteliği (HTTP içerik türü üstbilgisindeki charset parametresini yansıtır), unicode yaygın olarak benimsenmeden öncedir, ancak unicode'un internetin evrensel karakter kümesi olarak kabul edilmesine karar verildiğinde, charset özniteliği kullanılan kodlamayı belirtmek için yeniden tanımlandı , ancak ad geriye dönük uyumluluğa izin verecek şekilde değiştirilmedi.


9

“Karakter seti” terimi elbette “karakter seti” için kısadır, bu da karakter kodlaması için kullanılan eski bir terimdir ve a) bayt ve karakter dizileri arasında bir eşleme, b) tamsayılar arasında bir eşleme olarak yorumlanabilir. (kod numaraları) ve karakterler veya c) soyut karakterler ile tamsayılar veya bayt dizileri arasında bir eşleme.

Kısa ve basit bir ifade olduğu için “karakter seti” kullanıma alınmıştır. İçinde, “set” belirsiz bir anlama sahiptir (tüm kavram belirsiz olduğu için), ancak daha sonra Dan Connelly'nin (bir kez) ünlü Karakter Setinde açıklandığı gibi bir koleksiyon (set teorik anlamda “set”) olarak yanlış yorumlanmıştır. Zararlı sayılır .

O zaman en önemli şey, tanımlayıcının charsetMIME ve HTTP'de kullanılmasıydı. HTTP 1.0 diğer adı RFC 1945, MIME tanımını, “bir veya daha fazla tablo ile bir dizi sekizlik diziyi karakter dizisine dönüştürmek için kullanılan bir yöntem” ve daha sonra karışıklığı yorumlar: “'Karakter seti' teriminin bu kullanımı daha genel olarak 'karakter kodlaması' olarak adlandırılır. Ancak, HTTP ve MIME aynı kayıt defterini paylaştığından, terminolojinin de paylaşılması önemlidir. ”


1

RFC2045 , MIME içine "karakter seti" ni tanıttı ve o zamana kadar tüm kodlamaların bir karakter ile bir sekizli eşleştirilmediği zaten belliydi. RFC2130 bu geçmişi biraz daha tartışıyor.

Temel olarak, "karakter kümesi" bu standartlar yazıldığında daha popüler bir terimdi, "karakter kodlama" veya "metin kodlama şeması" ndan daha özlü ve "kodlama" dan daha az belirsizdir.


Bana 'charset' parametresi RFC 1341'de (Haziran 1992) zaten varmış gibi geliyor .
John Bartholomew

1

Metin aktarımı için geçerli en az 2 kodlama vardır. Karakter kodlaması, karakterlerin (gliflerin) nasıl kodlandığını açıklar. Tüm diller, genellikle 8 bit değerine kodlanan UCS karakter kümesinin bir alt kümesini kullanır. Standart karakter kümelerinin standart karakter kodlamaları vardır ve terimler genellikle birbirinin yerine kullanılır.

Aktarım kodlaması metnin nasıl aktarıldığını açıklar ve genellikle karakter kodlamasından bağımsızdır. Çoğu aktarım kodlaması saydam değildir ve aktarılan bayt dizisini değiştirir. 8-bit aktarım kodlaması 8-bit kodlamalar için saydamdır. 7 bit aktarım kodlaması yalnızca ASCII gibi 7 bit karakter kümelerini aktarabilir

ASCII, 7 bit olarak kodlanan şaryo kontrolü (satır besleme, form besleme, satır başı, geri boşluk ve sekmeler) için 95 yazdırılabilir karakter ve birkaç karakter daha kullanır. Kalan değerleri kullanan ek kontrol karakterleri vardır. ASCII, UCS karakter kümelerinin yanı sıra 8 bit karakter kümelerinin çoğunun uygun bir alt kümesidir. ISO-8859-1 ayrıca UCS karakter kümesinin uygun bir alt kümesidir, ancak bu karakterlerin UTF-8'de 127'den büyük karakter değerleri için birden çok bayt kullanan farklı kodlamaları vardır.

IBM ana çerçeveleri (d) farklı bir 8 bit kodlama kullanan EBCDID'yi kullanır. ASCII ve ECBDIC karakter kodlamaları arasında yazdırılabilir karakterleri eşleyen çeviri tabloları vardır. ECBDIC'in ASCII'den daha büyük bir karakter seti vardır, çünkü ASCII'de bulunmayan noktalama işaretleri vardır. Bu, ilk kodlama ECBDIC ise, bu iki kodlama arasında tam gidiş dönüş dönüşümünü engelleyebilir.

Bu kodlama, ASCII yazdırılabilir karakterleri kapsamadığı karakterleri olan diller için yeterli değildi. Microsoft ve diğerleri, ASCII karakter kümesine 8 bit uzantılar kullandı ve 127'nin üzerinde değerlere sahip ek karakterleri kodladı. Tek bir uzantı tüm diller için yeterli değildi, çünkü bu uzantılar karakter kümesine en fazla 96 karakter ekledi. Bu, farklı 8 bit karakter kodlamasına sahip farklı diller için birden çok karakter kümesinin (karakter kümesi) kullanılmasına neden oldu. Bu karakter kümeleri, o dil veya dil ailesi için gereken karakterleri içerir. Ek karakterler, farklı karakter kümelerindeki farklı değerlere kodlanabilir. İngiliz kullanıcılar bunu, yanlış karakter seti kullanılırsa yanlış görünen geniş noktalama işaretleriyle (sol ve sağ tırnak işaretleri ve tire) fark ederler.

Tek baytlık kodlamalar için yalnızca karakter kümesindeki karakterler kodlanabilir. Bazı diller, karakter kümelerini kapsamak için çok baytlı kodlamalar gerektiriyordu. Unicode (UCS) karakter kümesi, ASCII karakter kümesi dışındaki karakterler için çok baytlı kodlamalar gerektirir. Bu karakter seti, dile özgü tüm kodlamaların bir üst kümesidir. UTF-8, UCS karakter setinin kompakt bir kodlamasıdır. ASCII ek bayt gerektirmez ve çoğu (tümü?) Avrupa dil karakteri bir veya iki bayt olarak kodlanabilir. Tam UCS-2 karakter seti bir ila üç baytta kodlanabilir. Geçerli UCS karakter kümesindeki tüm karakterler bir ila dört baytta kodlanabilir.


0

FWIW, IIRC, Commodore'da 64 gün sonra, bir karakter kümesi {0, ... 255} 'den u ve v'nin belki 8 ve 12 olduğu tüm uxv siyah beyaz görüntüler kümesine bir işlevdi. " karakter kümesi ", bu görüntüleri tutmak üzere belirlenmiş bellek konumlarını değiştirmek için BASIC dilinde POKE komutunun kullanılması anlamına geliyordu. Örneğin, ASCII kodu 65 A anlamına gelir ve A görüntüsü, bazı b için a * 65 + b bellek adresinden başlayarak saklanır ve sanırım a = u * v.

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.