1. Wprowadzenie
Wyobraź sobie, że jesteś dyplomatą na międzynarodowym szczycie: każdy mówi w swoim języku i używa własnego pisma. Żeby się zrozumieć, potrzebny jest uniwersalny tłumacz — wspólny zestaw reguł dopasowania znaków. W komputerach tę rolę pełnią kodowania.
Komputer rozumie tylko jeden „język” — sekwencje zer i jedynek. 0 i 1 — to jego „alfabet”. Wszystkie informacje są przechowywane i przesyłane jako bajty. Jeden bajt to 8 bitów (np. 01000001).
Jak więc powiązać nasze litery i znaki z bajtami? Skąd komputer wie, że litera „A” — to nie tylko ciąg 0/1, lecz konkretny symbol na ekranie?
Kodowanie
Kodowanie — to zestaw reguł (tabela dopasowań), który określa, jak każdy znak (litera, cyfra, znak interpunkcyjny, ideogram, emoji) jest zamieniany na sekwencję bajtów i jak potem te bajty są z powrotem interpretowane jako znaki.
Analogia — alfabet Morse’a: tłumaczysz tekst na kropki i kreski, wysyłasz komunikat, a odbiorca według tych samych reguł odtwarza znaki. W komputerze ta umowa „bajty ↔ znaki” to i jest kodowanie.
2. Po co w ogóle nam ten ból głowy z kodowaniami?
- Tłumaczenie między światem ludzi a maszyną: bez kodowania tekst to tylko zbiór bajtów; z kodowaniem — sensowne znaki.
- Uniwersalność i kompatybilność: różne programy i systemy operacyjne muszą „dogadać się” co do reguł. Jeśli plik jest oznaczony jako UTF-8, to trzeba go czytać jako UTF-8.
- Wsparcie wielu języków i znaków: cyrylica, pismo arabskie, ideogramy, symbole matematyczne, emoji — im szerszy zestaw znaków, tym kodowanie musi być bardziej złożone i elastyczne.
3. ASCII – „pierwotne” kodowanie
Jednym z najstarszych i podstawowych kodowań jest ASCII (American Standard Code for Information Interchange). Używa 7 bitów na znak, czyli może reprezentować 128 różnych symboli: alfabet łaciński (A-Z, a-z), cyfry (0-9), znaki interpunkcyjne i kody sterujące (np. nowa linia, tabulacja).
| Znak | Kod dziesiętny (ASCII) | Kod binarny (7 bitów) |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Spacja | |
|
Historycznie ósmy bit często służył jako bit parzystości, a potem zaczęto go używać w „rozszerzeniach” ASCII — tak powstały różne jednobajtowe zestawy dla lokalizacji, co doprowadziło do bałaganu.
Jeśli napiszesz „Hello”, na dysku będzie to mniej więcej tak (po 1 bajcie na znak; dla 7-bitowego ASCII najstarszy bit jest zerowy):
H (01001000) e (01100101) l (01101100) l (01101100) o (01101111)
Proste. Ale gdzie litery rosyjskie albo ideogramy? W ASCII ich nie ma — to „jednojęzyczny słownik”, przydatny tylko dla podstawowego zestawu łacińskiego.
4. „Krakozjaby” — dlaczego kodowanie to nie żarty
Czasem, otwierając plik, widzisz coś w stylu Привет zamiast „Cześć”. To nazywa się „krakozjaby” (lub Mojibake) — efekt odczytu bajtów przy użyciu niewłaściwego kodowania.
Załóżmy, że zapisałeś „Hello, world!” w kodowaniu Windows-1251, gdzie bajty dla liter słowa privet mogą wyglądać (uproszczając) tak:
- P → 207
- r → 240
- i → 232
- v → 226
- e → 229
- t → 242
A potem kolega otworzył plik w edytorze, który spodziewał się ISO-8859-1 (Latin-1), albo użyłeś StreamReader bez jawnego określenia kodowania i nie zgadzało się z kodowaniem pliku. Efekt: bajt 207 jest interpretowany jako znak z innej tabeli — i tekst „się łamie”.
| Oryginalny symbol (Windows-1251) | Reprezentacja bajtów (przykład) | Znak odczytany jako ISO-8859-1 |
|---|---|---|
| P | |
Ç |
| r | |
à |
| i | |
è |
| v | |
â |
| e | |
å |
| t | |
ò |
W efekcie dostajesz Çàèâåò zamiast „Cześć”. Jeśli dany znak w ogóle nie istnieje w oczekiwanym kodowaniu, zobaczysz kwadraty albo znaki zapytania.
Stąd praktyczny wniosek: podczas czytania/zapisu tekstu warto jawnie określać kodowanie, szczególnie gdy źródło danych nie jest przez ciebie kontrolowane. W .NET robi się to przez StreamReader/StreamWriter z odpowiednim Encoding (np. UTF-8 lub Encoding.GetEncoding("windows-1251")). To pomaga uniknąć „krakozjabów” i zapewnia poprawną wymianę danych między systemami.
W następnych wykładach nauczymy się pewnie wybierać i określać kodowanie przy pracy z plikami i strumieniami, żeby wasz kod był uniwersalny, międzynarodowy i niezawodny.
GO TO FULL VERSION