CodeGym /Kursy /C# SELF /Czym jest kodowanie i po co ono w ogóle

Czym jest kodowanie i po co ono w ogóle

C# SELF
Poziom 37 , Lekcja 0
Dostępny

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)
A
65
1000001
B
66
1000010
a
97
1100001
b
98
1100010
0
48
0110000
1
49
0110001
!
33
0100001
Spacja
32
0100000

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:

  • P207
  • r240
  • i232
  • v226
  • e229
  • t242

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
207
Ç
r
240
à
i
232
è
v
226
â
e
229
å
t
242
ò

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.

2
Zadanie
C# SELF, poziom 37, lekcja 0
Niedostępne
Odszyfrowanie tekstu z kodów ASCII
Odszyfrowanie tekstu z kodów ASCII
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION