CodeGym /Kurslar /C# SELF /Kodlaşdırma nədir və niyə lazımdır

Kodlaşdırma nədir və niyə lazımdır

C# SELF
Səviyyə , Dərs
Mövcuddur

1. Giriş

Təsəvvür edin ki, beynəlxalq zirvədə diplomatsınız: hər kəs öz dilində danışır və öz yazı sistemindən istifadə edir. Bir-birinizi başa düşmək üçün universal tərcüməçi — simvolların uyğunlaşdırılması üçün ümumi qaydalar lazımdır. Kompüterlərdə bu rol kodlaşdırmalara həvalə olunub.

Kompüter yalnız bir "dil" başa düşür — sıfır və bir ardıcıllıqları. 01 onun "əlifbasıdır". Bütün məlumatlar baytlar şəklində saxlanır və ötürülür. Bir bayt — 8 bitdir (məsələn, 01000001).

Bəs bizim hərfləri və işarələri baytlarla necə əlaqələndirmək olar? Kompüter necə anlayır ki, hərf «A» sadəcə 0/1 ardıcıllığı deyil, ekranda göstərilən məhz o simvoldur?

Kodlaşdırma

Kodlaşdırma — hər bir simvolun (hərf, rəqəm, işarə, ideoqram, emoji daxil olmaqla) necə bayt ardıcıllığına çevrilməsini və sonra həmin baytların necə yenidən simvollar kimi şərh olunmasını müəyyən edən qaydalar toplusudur (uyğunluq cədvəli).

Analogiya — Mors kodu: mətni nöqtə və xətlərə çevirirsiniz, mesajı göndərirsiniz, qəbul edən eyni qaydalarla simvolları bərpa edir. Kompüterdə razılaşma "baytlar ↔ simvollar" şəklindədir — bu, kodlaşdırmadır.

2. Niyə bizə bu kodlaşdırma baş ağrısı lazımdır?

  • İnsanlar və maşınlar arasında tərcümə: kodlaşdırma olmadan mətn yalnız baytlar dəstidir; kodlaşdırma ilə isə məna kəsb edən simvollar alınır.
  • Universalite və uyğunluq: müxtəlif proqramlar və əməliyyat sistemləri qaydalar barədə "razılaşmalıdır". Fayl UTF-8 kimi elan olunubsa, onu da UTF-8 kimi oxumaq lazımdır.
  • Çoxsaylı dillər və simvolların dəstəyi: kirill, ərəb xətti, ideoqramlar, riyazi simvollar, emoji və s. — simvollar dəsti nə qədər genişdirsə, kodlaşdırma bir o qədər mürəkkəb və çevik olmalıdır.

3. ASCII – "əvvəlki" kodlaşdırma

Ən qədim və əsas kodlaşdırmalardan biri ASCII (American Standard Code for Information Interchange)-dir. O, hər simvol üçün 7 bit istifadə edir, yəni 128 fərqli simvolu təqdim edə bilir: latın hərfləri (A-Z, a-z), rəqəmlər (0-9), durğu işarələri və idarəedici kodlar (məsələn, sətirsonu, tab).

Simvol Onluq kod (ASCII) İkilik kod (7 bit)
A
65
1000001
B
66
1000010
a
97
1100001
b
98
1100010
0
48
0110000
1
49
0110001
!
33
0100001
Boşluq
32
0100000

Tarixən səkkizinci bit çox vaxt paritet biti üçün istifadə olunurdu, sonra isə onu ASCII-nin "genişləndirmələrində" istifadə etməyə başladılar — beləliklə lokal üçün müxtəlif təkbaytlı toplusu ortaya çıxdı və uyğunsuzluqlar yarandı.

Məsələn, əgər siz "Hello" yazsaz, diskdə bu təxminən belə olacaq (hər simvol üçün 1 bayt; 7-bit ASCII-də yüksək bit sıfırdır):

H (01001000) e (01100101) l (01101100) l (01101100) o (01101111)

Sadə. Amma rus hərfləri və ya ideoqrammlar haradadır? ASCII-də onlar yoxdur — bu "təkdilli lüğətdir", yalnız əsas latın dəsti üçün yararlıdır.

4. Təhrif olunmuş simvollar — niyə kodlaşdırma zarafat deyil

Bəzən faylı açanda Привет kimi bir şey görürsünüz, "Salam" əvəzinə. Buna "təhrif olunmuş simvollar" deyirlər (və ya Mojibake) — baytların yanlış kodlaşdırmada oxunmasının nəticəsidir.

Tutaq ki, siz "Salam, dünya!"-nı Windows-1251 kodlaşdırmasında yadda saxladınız, burada rus hərflərinin (sadələşdirilmiş formada) baytları belə ola bilər:

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

Sonra həmkarınız faylı ISO-8859-1 (Latin-1) gözləyən redaktorda açdı və ya siz StreamReader-dən kodlaşdırmanı açıq seçmədən istifadə etdiniz və o faylın kodlaşdırması ilə üst-üstə düşmədi. Nəticə: 207 baytı başqa cədvəldən gələn simvol kimi şərh olunur — və mətn "pozulur".

Orijinal simvol (Windows-1251) Bayt təmsili (nümunə) Simvol, ISO-8859-1 kimi oxunduqda
P
207
Ç
r
240
à
i
232
è
v
226
â
e
229
å
t
242
ò

Nəticədə alınır Çàèâåò əvəzinə «Salam». Əgər gözlənilən kodlaşdırmada simvol ümumiyyətlə yoxdursa, kvadratlar və ya sual işarələri görə bilərsiniz.

Buradan əsas praktik nəticə gəlir: mətnləri oxuyub yazarkən kodlaşdırmanı açıq şəkildə göstərmək vacibdir, xüsusən də məlumatların mənbəyi sizin nəzarətinizdə deyilsə. .NET-də bunu lazım olan StreamReader/StreamWriter-lə və uyğun Encoding-lə (məsələn, UTF-8 və ya Encoding.GetEncoding("windows-1251")) edirlər. Bu "təhrif olunmuş simvollar"dan qaçmağa və sistemlər arasında düzgün məlumat mübadiləsinə kömək edir.

Növbəti dərslərdə fayllarla və axınlarla işləyərkən kodlaşdırmanı necə düzgün seçib göstərməyi öyrənəcəyik ki, sizin kodunuz universal, beynəlxalq və etibarlı olsun.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION