CodeGym /Kurslar /JAVA 25 SELF /Kodlaşdırma nədir və nə üçün lazımdır

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

JAVA 25 SELF
Səviyyə, Dərs
Mövcuddur

1. Kodlaşdırma anlayışı (encoding)

Gəlin ən əsas sualdan başlayaq: kodlaşdırma nədir?

Təsəvvür edin ki, beynəlxalq bir konfransa gəlmisiniz. Hər kəs öz dilində danışır, amma hamı bir-birini anlamaq istəyir. Bunun üçün elə bir tərcüməçi lazımdır ki, bilsin: ingiliscə "hello" rus dilində "privet", ispan dilində isə "hola" deməkdir. Kompüterlər aləmində kodlaşdırma — məhz o tərcüməçidir.

Kodlaşdırma — simvolların baytlarla təqdim olunma üsuludur

Kompüter sadə məxluqdur: o, yalnız sıfır və birləri, yəni bitləri və baytları anlayır. Amma insanlar hərflər, rəqəmlər, emoji və hətta — vay! — çin heroqliflərini görmək istəyirlər. Kompüterin simvolu “yazması” üçün razılaşmaq lazımdır: hər bir simvol hansı bayt dəstinə uyğun gəlir.

Kodlaşdırma (encoding) — simvolların (hərflər, rəqəmlər, durğu işarələri, emoji və s.) saxlanma və ötürmə üçün baytlara çevrilməsi qaydaları toplusudur və əksinə: baytların göstərmək üçün simvollara çevrilməsi.

Nümunə: 'A' (kiril əlifbasında böyük A, U+0410) müxtəlif kodlaşdırmalarda

  • UTF-8 kodlaşdırmasında 'A' (kiril, U+0410) iki baytla kodlanır: 0xD0 0x90.
  • Windows-1251-də eyni işarə — bir baytdır: 0xC0.
  • Latın 'A' isə demək olar ki, bütün populyar kodlaşdırmalarda — 0x41.

Əgər faylı düzgün olmayan kodlaşdırmada oxusanız, simvollar “mojibake”ə (anlaşılmaz nişanələrə və ya sual işarələrinə) çevriləcək.

2. Niyə kodlaşdırmalar lazımdır

Niyə hərfləri sadəcə olduğu kimi saxlamaq olmur?

Çünki kompüter yalnız rəqəmləri (sıfır və birləri) başa düşür. Hansi rəqəmin hansı hərfə uyğun gəlməsi — elə kodlaşdırmanın mahiyyətidir.

Nümunə: “Privet” faylda

Fayla "Privet" sözünü yazanda, kompüter üçün bu sadəcə bayt ardıcıllığıdır. Bu baytların necə təfsir olunması — kodlaşdırmadan asılıdır.

  • Əgər fayl UTF-8-də yazılıbsa, U+041F iki baytdır, U+0440 da iki baytdır və s.
  • Əgər Windows-1251-dədirsə, hər hərf bir baytdır, amma baytların dəyərləri başqadır.

Harada kodlaşdırma lazımdır?

  • Mətni fayla yazarkən: sonra baytların düzgün oxunması üçün.
  • Mətni fayldan oxuyarkən: baytların yenidən hərflərə çevrilməsi üçün.
  • Mətni şəbəkə ilə göndərərkən (məsələn, HTTP, e‑mail).
  • Məlumat bazaları ilə işləyərkən: orada da mətnin hansı kodlaşdırmada saxlanıldığını bilmək lazımdır.

Əgər kodlaşdırmanı göstərməsəniz...

Bu, tanımadığınız dildə olan mətni açıb oxumağa çalışmaq kimidir. Əgər dilin nə olduğunu bilirsinizsə, şanslar artır. Bilmirsinizsə — yaxşı halda heç nə başa düşməyəcəksiniz, pis halda isə abrakadabra ilə qarşılaşacaqsınız.

3. Düzgün kodlaşdırma olmadan problemlər

“Mojibake” və məlumat itkisi

Yeni başlayan (və təkcə onlar deyil) proqramçıların ən çox rast gəldiyi şikayət: “Niyə "Privet" əvəzinə "Привет" və ya ümumiyyətlə təkcə sual işarələri görürəm?”

Bu, fayl bir kodlaşdırmada yazılıb, başqa bir kodlaşdırmada oxunanda baş verir. Məsələn, fayl köhnə Windows-da Windows-1251-də yaradılıb, siz isə onu Linux-da açırsınız, harada ki, susmaya görə UTF-8 istifadə olunur. Və ya əksinə.

Nümunə

  • Faylı Windows-1251-də yazdınız: U+041F üçün bayt — 0xCF.
  • UTF-8-də açdınız: proqram gözləyir ki, kiril simvolu iki bayt olsun, amma bir bayt alır. Hər şey pozulur.

Məlumat itkisi

Əgər yazarkən simvol seçilmiş kodlaşdırma tərəfindən dəstəklənmirsə (məsələn, ASCII-də emoji saxlamağa çalışırsınızsa), o, silinə və ya sual işarəsi ilə əvəz oluna bilər. Kodlaşdırmaya “sığmayan” hər nə varsa, itirilir.

Fayl mübadiləsi zamanı problemlər

Bir kodlaşdırmada yazılmış fayllar, əgər başqa kompüterdə susmaya görə fərqli kodlaşdırma varsa, düzgün göstərilməyə bilər. Bu, tez-tez Windows ilə Linux arasında fayl mübadiləsində və ya köhnə faylları açarkən baş verir.

4. Java-da kodlaşdırma: daxili və xarici təqdimat

JVM daxilində: həmişə Unicode (UTF-16)

Java-da sətirlər (String) proqram daxilində həmişə Unicode-da (dəqiq desək, UTF-16-da) saxlanılır. Bu o deməkdir ki, dəyişənlərə dünyanın istənilən dilində sətir mənimsədə bilərsiniz və Java bunların hamısını “həzm edəcək”.

String hello = "Salam, dünya! 😀";

JVM yaddaşında bu mətn 16‑bitlik ədədlər (char) dəsti kimi saxlanılır; burada hər simvolun Unicode cədvəlində öz kodu var.

Maraqlı fakt
Java-da char simvolu — 16 bitdir (2 bayt). Lakin bəzı simvollar (məsələn, nadir heroqliflər və ya emojilər) artıq iki char tələb edir — bunlara “surroqat cütlüklər” deyilir.

Giriş/çıxış zamanı: kodlaşdırmanın əhəmiyyəti var!

Siz sətirləri xarici aləmə (fayllar, şəbəkə) oxuyanda və ya yazanda, Java daxili təqdimatı (UTF-16) bayt ardıcıllığına çevirməlidir. Bax, burada kodlaşdırma lazımdır.

  • Əgər kodlaşdırmanı açıq şəkildə göstərməsəniz, Java sistemdə susmaya görə olan kodlaşdırmadan istifadə edəcək (rus dilli Windows-da bu Windows-1251, Linux-da isə UTF-8 ola bilər).
  • Bu təhlükəlidir: başqa kompüterdə nəticə fərqli ola bilər.

Nümunə: kodlaşdırmanı göstərmədən faylı oxuma və yazma

// Pis təcrübə! Kodlaşdırma göstərilməyib.
FileReader reader = new FileReader("data.txt");
FileWriter writer = new FileWriter("data.txt");

Bu halda Java sistemin kodlaşdırmasından istifadə edəcək. Əgər fayl başqa sistemdə yazılıbsa — “mojibake” alacaqsınız.

Yaxşı təcrübə: kodlaşdırmanı həmişə göstərmək

// Yaxşı! Kodlaşdırma açıq göstərilib.
BufferedReader reader = new BufferedReader(
    new InputStreamReader(new FileInputStream("data.txt"), StandardCharsets.UTF_8));
BufferedWriter writer = new BufferedWriter(
    new OutputStreamWriter(new FileOutputStream("data.txt"), StandardCharsets.UTF_8));

5. Qısa illüstrasiya: kodlaşdırma ilə işləyərkən nələr olur

Sxem: sətirin fayldan proqrama və geri yolu

[Diskdə fayl (baytlar, kodlaşdırma X)]
        |
        V
[Java baytları oxuyur və kodlaşdırma X vasitəsilə String-ə (UTF-16) çevirir]
        |
        V
[Siz proqramda sətirlə işləyirsiniz]
        |
        V
[Java String-i baytlara çevirir, kodlaşdırma Y istifadə olunur]
        |
        V
[Diskdə fayl (baytlar, kodlaşdırma Y)]

Əgər X və Y üst-üstə düşürsə — hər şey qaydasındadır. Fərqlidirsə — problemlər mümkündür.

6. Kodlaşdırmaların qısa tarixi (maraqalananlar üçün)

ASCII

ASCII — ən qədim kodlaşdırmalardan biridir: hər simvol üçün bir bayt, yalnız ingilis əlifbası, rəqəmlər və əsas durğu işarələri. Digər əlifbalar — kənarda qalır.

Windows-1251, ISO-8859-1 və digər “köhnələr”

Bunlar müxtəlif hərf dəstləri üçün birbaytlı kodlaşdırmalardır: kiril, latın, yunan və s. Hər kəs özünkünü seçdi və qarışıqlıq başladı.

Unicode və UTF ailəsi

  • Unicode — dünyanın simvolları üçün qlobal cədvəldir.
  • UTF-8, UTF-16, UTF-32 — Unicode simvollarını baytlarla təqdim etməyin müxtəlif üsullarıdır.
  • UTF-8 Web, fayllar və sistemlərarası mübadilə üçün standart oldu.

7. Təcrübə: kodlaşdırma fayllarla işləməyə necə təsir edir

Gəlin müxtəlif kodlaşdırmalarda sətirlərin yazılması və oxunmasına aid kiçik bir nümunəyə baxaq.

Nümunə: müxtəlif kodlaşdırmalarda yazma və oxuma

import java.io.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

public class EncodingDemo {
    public static void main(String[] args) throws IOException {
        String text = "Salam, dünya! 😀";

        // Faylı UTF-8 ilə yazacağıq
        try (Writer writer = new OutputStreamWriter(
                new FileOutputStream("utf8.txt"), StandardCharsets.UTF_8)) {
            writer.write(text);
        }

        // İndi onu səhv kodlaşdırmada oxumağa çalışaq
        try (Reader reader = new InputStreamReader(
                new FileInputStream("utf8.txt"), Charset.forName("Windows-1251"))) {
            int c;
            while ((c = reader.read()) != -1) {
                System.out.print((char) c);
            }
        }
        // Ekranda qarışıq simvollar (mojibake) olacaq!
    }
}

Nəticə: Əgər kodlaşdırmalar üst-üstə düşmürsə — mətn təhrif olunacaq.

8. Kodlaşdırma və digər sistemlərlə inteqrasiya

Real layihələrdə fayllar tez-tez müxtəlif proqramlar arasında, müxtəlif proqramlaşdırma dillərində yazılmış və müxtəlif ƏS-lərdə işləyən sistemlər arasında mübadilə olunur. Hər biri öz kodlaşdırmasını gözləyə bilər. Əvvəldən razılaşdırmasanız — “mojibake” və tutması çətin olan baxlar qaçılmazdır. Tipik hal: verilənlər bazası mətni UTF-8-də saxlayır, proqram isə ilkin faylı Windows-1251 kimi oxuyur və BƏ-yə yükləyir — simvolların təhrifi təmin olunur.

9. Kodlaşdırma ilə işləyərkən tipik səhvlər

Səhv №1: Faylı oxuma/yazmada kodlaşdırma göstərilməyib.
Nəticədə proqram “məndə işləyir”, amma həmkarınızda — “mojibake”.

Səhv №2: Köhnəlmiş konstruktorlardan istifadə (FileReader, FileWriter).
Onlar həmişə sistemin kodlaşdırmasından istifadə edir — yeni başlayanlar üçün tələdir.

Səhv №3: Mənbə fayl üçün yanlış kodlaşdırma.
Əgər fayl bir kodlaşdırmada yazılıb, digərində oxunursa, bəzi simvollar təhrif olunacaq və ya sual işarəsi ilə əvəzlənəcək.

Səhv №4: Kodlaşdırmalar arasında keçiddə simvolların itməsi.
Əgər hədəf kodlaşdırma bütün simvolları dəstəkləmirsə (məsələn, UTF-8 əvəzinə ASCII), mətnin bir hissəsi sadəcə yox olacaq.

1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Gizli mesajın ötürülməyə hazırlanması 🕵️‍♂️
Gizli mesajın ötürülməyə hazırlanması 🕵️‍♂️
1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Sehrli svitokun saxlanması və bərpası 📜
Sehrli svitokun saxlanması və bərpası 📜
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION