Dlaczego „charset” naprawdę oznacza „kodowanie” w powszechnym użyciu?

10

Coś, co od dawna mnie myliło, to fakt, że tak wiele programów używa terminów „charset” i „kodowanie” jako synonimów.

Kiedy ludzie odnoszą się do „kodowania” unicode, zawsze mają na myśli zestaw reguł do reprezentowania znaków unicode jako ciąg bajtów - jak ASCII lub UTF-8. Wydaje się to rozsądne i intuicyjne; Chodzi o to, że „kodujesz” te znaki jako bajty przy użyciu określonego zestawu reguł.

Ponieważ te zestawy reguł czasami zapewniają jedynie „kodowanie” niektórych podzbiorów wszystkich znaków Unicode, można sobie wyobrazić, że „zestaw znaków” - skrót od „zestawu znaków” - oznacza po prostu zestaw znaków Unicode - bez względu na to, jak te znaki są zakodowane. Kodowanie oznaczałoby zatem zestaw znaków (kodowanie takie jak ASCII, które ma tylko reguły kodowania 128 znaków, byłoby powiązane z zestawem znaków tych 128 znaków), ale zestaw znaków nie musi oznaczać kodowania (na przykład UTF-8, UTF -16 i UTF-32 są różnymi kodowaniami, ale mogą kodować ten sam zestaw znaków).

A jednak - i oto sedno mojego pytania - użycie słowa „charset” w świecie rzeczywistym nie odpowiada temu, co sugeruje konstrukcja tego słowa. Prawie zawsze jest używane w znaczeniu „kodowania”.

Na przykład:

Ile lat ma to dziwne (ab) użycie języka i jak powstała ta sprzeczna z intuicją definicja „zestawu znaków”? Czy to może pochodzić z czasów, kiedy naprawdę był w praktyce odwzorowanie jeden do jednego między kodowań w użyciu i zestawy znaków są obsługiwane? A może istniał jakiś szczególnie wpływowy standard lub specyfikacja, które podyktowały tę definicję tego słowa?

Mark Amery
źródło
5
Zastosowanie charsetwcześniejszych niż standard Unicode, więc chociaż nie mogło to być „odwzorowanie jeden na jeden”, znaki wymagane w dokumencie zwykle wymuszały wybór kodowania. Ale nie mam czasu na badanie faktycznej historii tego słowa ...
AmeliaBR
2
Mówisz o zestawach znaków jako o „zestawie znaków Unicode”, tak jakby ktoś zaczął od Unicode, a następnie wybrał podzbiory. Bardziej trafne jest stwierdzenie, że wiele zestawów znaków istniało przed wynalezieniem Unicode (lub przynajmniej zanim Unicode stał się wszechobecny), a Unicode jest celowo skonstruowany, aby być ich nadzbiorem.
John Bartholomew

Odpowiedzi:

3

Pojęcie zestawów znaków jest starsze niż Unicode.

Przed Unicode zestaw znaków definiował zestaw znaków i sposób, w jaki każdy znak był reprezentowany jako bity. Większość zestawów znaków zamapowała znak na bajt (co pozwoliło na zestaw 256 znaków), niektóre zmapowane na dwa bajty, a kilka (jak ASCII) tylko na 7 bitów. Różne zestawy znaków często przypisywały różne wartości temu samemu znakowi i nie było uniwersalnego klucza translacji między różnymi używanymi zestawami znaków.

Unicode był próbą rozwiązania tego problemu poprzez ujednolicenie wszystkich różnych zestawów znaków we wspólnym „nadzbiorze”. W tym celu Unicode wprowadził kilka dodatkowych poziomów abstrakcji, na przykład pojęcie kodowania znaków jako coś odrębnego od wartości punktów kodowych. Umożliwiło to Unicode ponowne zdefiniowanie zestawów znaków sprzed Unicode jako kodowania znaków Unicode.

Na przykład atrybut charset w HTML (który odzwierciedla parametr charset w nagłówku typu treści HTTP) pochodzi sprzed szerokiej adaptacji Unicode, ale kiedy zdecydowano się zaakceptować Unicode jako uniwersalny zestaw znaków w Internecie, atrybut charset został po prostu przedefiniowany, aby określić używane kodowanie , ale nazwa nie została zmieniona, aby umożliwić zgodność wsteczną.

JacquesB
źródło
9

Termin „zestaw znaków” jest oczywiście skrótem od „zestawu znaków”, który z kolei jest starym terminem używanym do kodowania znaków, który można interpretować jako a) odwzorowanie między sekwencjami bajtów i znaków, b) odwzorowanie między liczbami całkowitymi (numery kodów) i znaki lub c) mapowanie między znakami abstrakcyjnymi a liczbami całkowitymi lub sekwencjami bajtów.

„Zestaw znaków” został wykorzystany, ponieważ jest to krótkie i proste wyrażenie. „Zestaw” ma w tym sensie niejasne znaczenie (ponieważ cała koncepcja jest niejasna), ale później często był błędnie interpretowany jako zbiór („zestaw” w sensie teoretycznym zestawu), jak opisano w słynnym (niegdyś) zestawie znaków Dana Connelly'ego Uważany za szkodliwy .

Liczyło się wtedy przede wszystkim to, że identyfikator charsetzostał użyty w MIME i HTTP. Alias HTTP 1.0 RFC 1945 cytuje definicję MIME, „metodę używaną z jedną lub większą liczbą tabel do konwersji sekwencji oktetów na sekwencję znaków”, a następnie komentuje zamieszanie: „To użycie terminu„ zestaw znaków ”jest bardziej powszechnie określany jako „kodowanie znaków”. Ponieważ jednak HTTP i MIME współużytkują ten sam rejestr, ważne jest, aby terminologia była również wspólna. ”

Jukka K. Korpela
źródło
1

RFC2045 wprowadził „zestaw znaków” do MIME i do tego czasu było już jasne, że nie wszystkie kodowania zamapowały jeden znak na jeden oktet. RFC2130 omawia tę historię nieco więcej.

Zasadniczo „zestaw znaków” był bardziej popularnym terminem, gdy te standardy zostały napisane, jest bardziej zwięzły niż „kodowanie znaków” lub „schemat kodowania tekstu” i mniej dwuznaczny niż „kodowanie”.

Steve Clay
źródło
Wydaje mi się, że parametr „charset” był już obecny w RFC 1341 (czerwiec 1992).
John Bartholomew
1

Istnieją co najmniej 2 kodowania mające zastosowanie do przesyłania tekstu. Kodowanie znaków opisuje sposób kodowania znaków (glifów). Wszystkie języki używają podzbioru zestawu znaków LUW, które często są kodowane na 8-bitową wartość. Znormalizowane zestawy znaków mają standardowe kodowanie znaków, a terminy są ogólnie używane zamiennie.

Kodowanie przesyłania opisuje sposób przesyłania tekstu i jest zasadniczo niezależne od kodowania znaków. Większość kodowań przesyłania nie jest przezroczysta i zmienia przesyłaną sekwencję bajtów. 8-bitowe kodowanie transferu jest przezroczyste dla kodowania 8-bitowego. 7-bitowe kodowanie przesyłania może przesyłać tylko 7-bitowe zestawy znaków, takie jak ASCII

ASCII używa 95 znaków do wydrukowania i kilku innych znaków do kontroli karetki (przesunięcie wiersza, przesunięcie formularza, powrót karetki, cofanie i tabulatory) zakodowane w 7 bitach. Istnieją pozostałe znaki sterujące, które wykorzystują pozostałe wartości. ASCII jest odpowiednim podzbiorem zestawów znaków UCS, a także wielu 8-bitowych zestawów znaków. ISO-8859-1 jest również właściwym podzbiorem zestawu znaków UCS, ale znaki te mają różne kodowanie w UTF-8, który wykorzystuje wiele bajtów dla wartości znaków większych niż 127.

Komputery mainframe IBM używają (d) EBCDID, który używał innego 8-bitowego kodowania. Istnieją tabele tłumaczeń, które odwzorowują drukowalne znaki między kodowaniem znaków ASCII i ECBDIC. ECBDIC ma większy zestaw znaków niż ASCII, ponieważ ma znaki interpunkcyjne niedostępne w ASCII. Może to zapobiec pełnej transformacji w obie strony między tymi dwoma kodowaniami, jeśli kodowanie początkowe to ECBDIC.

Te kodowanie nie było wystarczające dla języków ze znakami nieobjętymi znakami drukowalnymi ASCII. Microsoft i inni używali 8-bitowych rozszerzeń zestawu znaków ASCII i kodowali dodatkowe znaki o wartości powyżej 127. Pojedyncze rozszerzenie nie było wystarczające dla wszystkich języków, ponieważ rozszerzenia te dodawały tylko 96 znaków do zestawu znaków. Spowodowało to użycie wielu zestawów znaków (zestawów znaków) dla różnych języków z różnym 8-bitowym kodowaniem znaków. Te zestawy znaków obejmują znaki wymagane dla tego języka lub rodziny języków. Dodatkowe znaki mogą być kodowane do różnych wartości w różnych zestawach znaków. Angielscy użytkownicy najprawdopodobniej zauważą to z rozszerzoną interpunkcją (lewy i prawy cudzysłów oraz myślniki), które wyświetlają się niepoprawnie, jeśli użyje się niewłaściwego zestawu znaków.

W przypadku kodowania jednobajtowego można kodować tylko znaki z zestawu znaków. Niektóre języki wymagały kodowania wielobajtowego, aby zakryć swój zestaw znaków. Zestaw znaków Unicode (UCS) wymaga kodowania wielobajtowego dla znaków spoza zestawu znaków ASCII. Ten zestaw znaków jest nadzbiorem wszystkich kodowań specyficznych dla języka. UTF-8 to kompaktowe kodowanie zestawu znaków UCS. ASCII nie wymaga dodatkowych bajtów, a większość (wszystkich?) Znaków języka europejskiego może być zakodowana jako jeden lub dwa bajty. Pełny zestaw znaków UCS-2 może być zakodowany w jednym do trzech bajtów. Wszystkie znaki w bieżącym zestawie znaków LUW mogą być zakodowane w jednym do czterech bajtów.

BillThor
źródło
0

FWIW, IIRC, Powrót do Commodore 64 dni, zestaw znaków był funkcją od {0, ... 255} do zestawu wszystkich czarno-białych obrazów uxv, gdzie u i v były może 8 i 12. Więc "zmieniając twój zestaw znaków ”oznacza użycie polecenia POKE w języku BASIC do modyfikacji lokalizacji pamięci przeznaczonych do przechowywania tych obrazów. Na przykład kod ASCII 65 oznaczał A, a obraz A byłby przechowywany począwszy od adresu pamięci a * 65 + b dla niektórych b, i wydaje mi się, że a = u * v.

Bjørn Kjos-Hanssen
źródło