Aby zrozumieć atrybut „encoding”, musisz zrozumieć różnicę między bajtami a znakami .
Pomyśl o bajtach jako o liczbach od 0 do 255, podczas gdy znaki to takie rzeczy jak „a”, „1” i „Ę”. Zestaw wszystkich dostępnych znaków nazywany jest zestawem znaków .
Każdy znak ma sekwencję jednego lub więcej bajtów, które są używane do jego reprezentacji; jednak dokładna liczba i wartość bajtów zależy od zastosowanego kodowania i istnieje wiele różnych kodowań.
Większość kodowań opiera się na starym zestawie znaków i kodowaniu zwanym ASCII, które zawiera jeden bajt na znak (w rzeczywistości tylko 7 bitów) i zawiera 128 znaków, w tym wiele typowych znaków używanych w amerykańskim angielskim.
Na przykład tutaj jest 6 znaków w zestawie znaków ASCII, które są reprezentowane przez wartości od 60 do 65.
Extract of ASCII Table 60-65
╔══════╦══════════════╗
║ Byte ║ Character ║
╠══════╬══════════════║
║ 60 ║ < ║
║ 61 ║ = ║
║ 62 ║ > ║
║ 63 ║ ? ║
║ 64 ║ @ ║
║ 65 ║ A ║
╚══════╩══════════════╝
W pełnym zestawie ASCII najniższa używana wartość to zero, a najwyższa 127 (oba to ukryte znaki sterujące).
Jednak gdy zaczniesz potrzebować więcej znaków niż zapewnia podstawowy ASCII (na przykład litery z akcentami, symbole walut, symbole graficzne itp.), ASCII nie jest odpowiednie i potrzebujesz czegoś bardziej rozbudowanego. Potrzebujesz więcej znaków (inny zestaw znaków) i potrzebujesz innego kodowania, ponieważ 128 znaków nie wystarcza, aby zmieścić wszystkie znaki. Niektóre kodowania oferują jeden bajt (256 znaków) lub do sześciu bajtów.
Z biegiem czasu powstało wiele kodowań. W świecie Windows istnieje CP1252 lub ISO-8859-1, podczas gdy użytkownicy Linuksa preferują UTF-8. Java natywnie używa UTF-16.
Jedna sekwencja wartości bajtów dla znaku w jednym kodowaniu może oznaczać zupełnie inny znak w innym kodowaniu, a nawet może być nieprawidłowa.
Na przykład, w ISO 8859-1 , Â jest reprezentowany przez jeden bajt wartości 226, podczas gdy w UTF-8 to dwa bajty: 195, 162. Jednak w ISO 8859-1 , 195, 162byłyby dwie postacie, a, ¢ .
Pomyśl o XML nie jako o sekwencji znaków, ale o sekwencji bajtów.
Wyobraź sobie, że system odbierający XML widzi bajty 195, 162. Skąd wie, jakie to postacie?
Aby system mógł zinterpretować te bajty jako rzeczywiste znaki (a więc wyświetlić je lub przekonwertować na inne kodowanie), musi znać kodowanie używane w XML.
Ponieważ większość typowych kodowań jest kompatybilna z ASCII, jeśli chodzi o podstawowe znaki alfabetu i symbole, w takich przypadkach sama deklaracja może uciec z użyciem tylko znaków ASCII do określenia kodowania. W innych przypadkach parser musi spróbować ustalić kodowanie deklaracji. Ponieważ wie, że deklaracja zaczyna się od <?xml, jest o wiele łatwiejsza do zrobienia.
Na koniec versionatrybut określa wersję XML, której obecnie są dwie (zobacz wersje XML Wikipedii . Istnieją niewielkie różnice między wersjami, więc parser XML musi wiedzieć, z czym ma do czynienia. W większości przypadków (dla języka angielskiego głośniki i tak), wersja 1.0 jest wystarczająca.