2010-08-09 16 views
16

Naprawdę staram się polepszyć z tymi rzeczami. Jestem dość funkcjonalny z takimi koncepcjami internacjonalizacji, ale muszę mieć lepsze podstawy teorii.Jaka jest różnica między "kodowaniem", "zestawem znaków" i "stroną kodową"?

Przeczytałem Spolsky's article, ale nadal nie jestem pewien, ponieważ te trzy pojęcia są używane zamiennie dużo - nawet w tym artykule. Myślę, że co najmniej dwóch z nich mówi o tym samym.

Podejrzewam, że wysoki odsetek programistów przepływa przez te rzeczy codziennie. Nie chcę być już jednym z tych programistów.

Odpowiedz

27

"Zestaw znaków" to dokładnie to, co mówi: właściwie określona lista odrębnych znaków.

"Kodowanie" to odwzorowanie pomiędzy zestawem znaków (zazwyczaj obecnie w standardzie Unicode) i (zazwyczaj w postaci bajtów) techniczną reprezentacją znaków.

UTF-8 to kodowanie, ale nie zestaw znaków. Jest to kodowanie zestawu znaków Unicode (*).

Dezorientacja pojawia się, ponieważ większość innych znanych kodowań (np .: ISO-8859-1) zaczęło się jako osobne zestawy znaków. Kiedy pojawił się Unicode jako nadzbiór większości zestawów znaków, można było myśleć o nich jako o różnych (ale częściowych) kodowaniach tego samego zestawu znaków (Unicode), a nie tylko pojedynczych zestawów znaków. Patrzenie na nie w ten sposób pozwala na łatwą konwersję między nimi za pomocą Unicode, co nie byłoby możliwe, gdyby były jedynie wyizolowanymi zestawami znaków. Ale nadal sensowne jest odwoływanie się do nich jako zestawów znaków, więc można użyć dowolnego terminu.

"Strona kodowa" to termin wywodzący się z IBM, gdzie wybrano, który zestaw symboli zostanie wyświetlony. Termin ten był nadal używany przez DOS, a następnie przez Windows, do systemu Windows z obsługą Unicode, w którym działa on tylko jako kodowanie z numerem. Podczas gdy numerowana "strona kodowa" jest ideą, która nie jest z natury ograniczona do Microsoftu, obecnie termin ten prawie zawsze oznacza tylko kodowanie, o którym wie Windows.

Kiedy mówi się o stronie kodowej , zazwyczaj mówi się o kodowaniu specyficznym dla systemu Windows, w odróżnieniu od kodowania opracowanego przez organ normalizacyjny. Na przykład strona kodowa 28591 normalnie nie byłaby przywoływana pod tą nazwą, ale po prostu "ISO-8859-1". Specyficzne dla Windows kodowanie w Europie Zachodniej w oparciu o ISO-8859-1 (z kilkoma dodatkowymi znakami zastępującymi niektóre z jego kodów sterujących) jest zwykle określane jako "strona kodowa 1252".

[*: Wszystkie UTF to kodowanie, a nie zestawy znaków, ale tego typu rzeczy nie dotyczą wyłącznie Unicode. Na przykład japoński standard JIS X 0208 definiuje zestaw znaków i dwa różne kodowania bajtów: nieco nieprzyjemne kodowanie oparte na wysokobajtowych ("Shift-JIS") i głęboko przerażające kodowanie oparte na przełączaniu ucieczki (JIS ").]

5

Zestaw znaków to po prostu zestaw znaków, które można wykorzystać.
Każdy z tych znaków jest zamapowany na liczbę całkowitą zwaną punktem kodowym.
Sposób przedstawiania tych punktów kodowych w pamięci to kodowanie. Kodowanie to po prostu metoda przekształcania punktu kodowego (U + 0041 - kodowy kod Unicode dla znaku "A") w surowe dane (bity i bajty).

1

Rozdział o kodzie Unicode w tej książce, Advanced Perl Programming zawiera najlepszy opis kodowania, zestawów znaków i innych elementów unicode, z którymi się zetknąłem. Niestety nie sądzę, że jest dostępny za darmo on-line.

+1

Mam subskrypcję Safari. Właśnie pobrałem rozdział, dzięki. – Deane

+0

samo tutaj z subskrypcją na safari :-) dzięki, dobrze wyglądam –

3

Pomyślałem, że artykuł Joela był prawie na miejscu - to historia ewolucji zestawów znaków i przechowywania, która doprowadziła do tego.

FWIW moim nazbyt uproszczonych widzenia

  • Zestawy znaków (ASCII, EBCDIC, UNICODE) będzie reprezentacja numeryczna znaków, niezależnie od rozważań przechowywania
  • Kodowanie będzie odnosić się do efektywnego przechowywania znaków, ANSI, UTF-7, UTF-8 itp., Dla pliku, przez przewód itp.
  • Strona kodowa byłaby "kluczem" potrzebnym, gdy zapotrzebowanie na dodanie nowych znaków (bez chęci zwiększenia pojemności) oznaczało, że (niektórych) znaków można było poznać tylko w dodatkowym kontekście strony kodowej.

IMHO Wikipedia aktualnie nie pomaga rzeczy poprzez zdefiniowanie code page jako „inna nazwa dla kodowania znaków” i przekierowanie „” to zestaw znaków 'character encoding'

+0

IMHO, nie ma takiego kodowania "ANSI". Nazwa "ANSI" jest mylącą nazwą. – nn0p

6

zestaw znaków to zestaw znaków, czyli „glify "tj. symbole wizualne reprezentujące jednostki komunikacji. Litera a jest glifem, a więc jest (znak euro). Zestawy znaków zazwyczaj odwzorowują liczby całkowite (współrzędne) na każdą postać, ale to kodowanie dyktuje binarną reprezentację postaci.

Jestem programistą ruby, więc oto kilka przykładów, które pomogą Ci zrozumieć pojęcia.

To pokazuje, w jaki sposób kod Unicode mapuje kody od znaków, ale nie w jaki sposób jest przechowywany każdy bajt. (Rubin 1,9 domyślnie na Unicode.)

>> 'a'.codepoints.to_a 
=> [97] 
>> '€'.codepoints.to_a 
=> [8364] 

następuje ujawnia sposób UTF-8 przechowuje kodowania każdej postaci jako bajty (0 thru-255 w podstawie 10). (Domyślne kodowanie Ruby 1.9 to UTF-8.) Ponieważ 8364 (baza 10) jest zbyt duży, aby zmieścić się w jednym bajcie, UTF-8 ma specjalną strategię na podzielenie go na wiele bajtów. Wikipedia pokazuje algorytm kodowania UTF-8, jeśli chcesz zagłębić się w implementację.

>> 'a'.bytes.to_a 
=> [97] 
>> '€'.bytes.to_a 
=> [226, 130, 172] 

Oto samo w ISO-8859-15 zestawu char:

>> 'a'.encode('iso-8859-15').codepoints.to_a 
=> [97] 
>> '€'.encode('iso-8859-15').codepoints.to_a 
=> [164] 

I kodowania ISO-8859-15:

>> 'a'.encode('iso-8859-15').bytes.to_a 
=> [97] 
>> '€'.encode('iso-8859-15').bytes.to_a 
=> [164] 

Zauważ, że ISO-8859- 15 punktów kodowych pasuje do reprezentacji bajtów.

Oto wpis blogu, który może być przydatny: http://blog.grayproductions.net/articles/what_is_a_character_encoding. Wpisy od 1 do 3 są dobre, jeśli nie chcesz, aby były zbyt specyficzne dla rubinów.