CodeGym /Kurslar /JAVA 25 SELF /Əsas kodlaşdırmalar: UTF-8, UTF-16, ISO-8859-1

Əsas kodlaşdırmalar: UTF-8, UTF-16, ISO-8859-1

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

1. UTF-8 — müasir kodlaşdırmaların kralı

Proqramçının işində siz müxtəlif kodlaşdırmalardan istifadə olunan fayllar, şəbəkə protokolları, verilənlər bazaları, veb‑servislərlə qarşılaşacaqsınız. Əgər UTF-8 ilə ISO-8859-1 arasındakı fərqi bilmirsinizsə, asanlıqla tələyə düşə bilərsiniz: kodunuz “məndə işləyir”, amma Fransadakı həmkarınızda və ya “susmaya görə” fərqli sistemi olan bulud mühitində sıradan çıxacaq.

Bu gün real həyatda Java‑inkişafçısının qarşısına çıxan üç əsas kodlaşdırmanı nəzərdən keçirəcəyik:

  • UTF-8 — müasir universal standart.
  • UTF-16 — Java-da sətirlərin daxili formatı, Windows-da da tez-tez rast gəlinir.
  • ISO-8859-1 (Latin-1) — köhnə olsa da hələ də istifadə olunan, Qərbi Avropa dilləri üçün birbaytlı kodlaşdırma.

Gəlin onlarla yaxından tanış olaq!

Bu nədir?

UTF-8 (Unicode Transformation Format, 8-bit) — böyük Unicode cədvəlindəki istənilən simvolu (buraya kiril əlifbası, çin heroqlifləri, emojilər və hətta nadir qədim yazılar daxildir) təqdim edə bilən kodlaşdırmadır. Üstəlik bunu çox çevik edir: ən populyar simvollar üçün (ingilis hərfləri, rəqəmlər, durğu işarələri) cəmi 1 bayt istifadə olunur. Digərləri üçün — 2, 3 və ya hətta 4 bayt.

Fakt: Bütün müasir saytlar, əksər JSON- və XML-fayllar, hətta Java mənbə faylları “susmaya görə” UTF-8-dən istifadə edir.

Bir simvol üçün neçə bayt lazımdır?

  • ASCII‑simvollar (ingilis hərfləri, rəqəmlər, durğu işarələri) — 1 bayt.
  • Kiril simvolları, Avropa dillərinin diakritikalı simvolları — 2 bayt.
  • Çin, yapon, koreya heroqlifləri — 3 bayt.
  • Super‑ekzotika, emojilər — 4 bayt.

Nümunə:

Simvol Unicode-da kod UTF-8 (baytlarda)
A
U+0041
41
Ya
U+042F
D0 AF
€
U+20AC
E2 82 AC
😀
U+1F600
F0 9F 98 80

Niyə UTF-8 əladır?

  • ASCII ilə geriyə uyğun: fayl yalnız ingilis simvolları ehtiva edirsə, o, ASCII-dəki kimi tam eyni görünür.
  • Yığcamlıq: qısa ingilisdilli mətnlər üçün UTF-8 faylının ölçüsü minimal olur.
  • Beynəlxalq: emojilər də daxil olmaqla bütün dilləri dəstəkləyir.
  • Veb üçün standart: HTML, CSS, JSON, XML, JavaScript — bunların hamısı “susmaya görə” UTF-8-dir.

Java-da istifadə nümunəsi

import java.nio.charset.StandardCharsets;
import java.nio.file.*;

public class Utf8Demo {
    public static void main(String[] args) throws Exception {
        // Mətni fayla UTF-8 ilə yazmaq
        String text = "Salam, dünya! 😀";
        Files.write(Paths.get("utf8.txt"), text.getBytes(StandardCharsets.UTF_8));

        // Faylı UTF-8 ilə oxumaq
        String read = Files.readString(Paths.get("utf8.txt"), StandardCharsets.UTF_8);
        System.out.println(read); // Çap edəcək: Salam, dünya! 😀
    }
}

Burada biz əvvəlcə sətiri yazmazdan əvvəl onu açıq şəkildə UTF-8-də kodlaşdırırıq, sonra isə oxuyarkən eyni kodlaşdırmanı göstəririk. Bunun sayəsində mətndə emojilər və ya müxtəlif dillərin simvolları olsa belə, mətn təhrif olunmadan saxlanılır və bərpa edilir.

UTF-8-i nə vaxt istifadə etməli?

Həmişə, yalnız başqa bir seçim üçün çox ciddi səbəbiniz olmadıqda. Bu, bütün müasir tətbiqlər üçün universal seçimdir.

2. UTF-16 — Java-nın daxili formatı

UTF-16 — Unicode ailəsindən olan başqa bir kodlaşdırmadır. UTF-8-dən fərqli olaraq, o, çox vaxt bir simvol üçün 2 bayt istifadə edir. Java sətirləri (String) və simvolları (char) JVM daxilində məhz belə saxlayır. Amma bir nüans var: bəzi simvollar (məsələn, nadir heroqliflər və ya emojilər) artıq 4 bayt (iki “surroqat cüt”) tələb edir.

UTF-16 harada istifadə olunur?

  • Java daxilində: bütün sətir və simvollar — UTF-16-dır.
  • Windows: Windows-da bir çox sistem faylı UTF-16-dan istifadə edir (məsələn, Notepad “susmaya görə” UTF-16 LE-də saxlayır).
  • Bəzi şəbəkə protokolları və formatlar: məsələn, XML UTF-16 ola bilər.

Nümunə: UTF-16-da simvol necə görünür

Simvol Unicode-da kod UTF-16 (baytlar) Şərh
A
U+0041
00 41
2 bayt
Ya
U+042F
04 2F
2 bayt
€
U+20AC
20 AC
2 bayt
😀
U+1F600
D8 3D DE 00
4 bayt (surroqat cüt)

Java-da istifadə nümunəsi

import java.nio.charset.StandardCharsets;
import java.nio.file.*;

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

        // Sətiri UTF-16 kodlaşdırmasından istifadə edərək fayla yazmaq
        Files.write(Paths.get("utf16.txt"), text.getBytes(StandardCharsets.UTF_16));

        // Faylın məzmununu UTF-16 kodlaşdırması ilə oxumaq
        String read = Files.readString(Paths.get("utf16.txt"), StandardCharsets.UTF_16);
        System.out.println(read); // İlkin sətrin düzgün çıxışı
    }
}

Əsas məqam: yazarkən və oxuyarkən eyni kodlaşdırmanı göstərmək lazımdır. UTF-16-da yazıb “susmaya görə” (məsələn, UTF-8də) oxusanız, simvollardan “kasa” yaranacaq.

UTF-16-in xüsusiyyətləri

  • Əksər simvollar üçün sabit uzunluq: 2 bayt.
  • Surroqat cütlər: bəzi simvollar (məsələn, emojilər) 4 bayt tələb edir.
  • Byte Order Mark (BOM): faylın əvvəlində tez-tez baytların sırasını göstərən xüsusi “başlıq” əlavə olunur (LE — little endian, BE — big endian). Java adətən BOM-u özü müəyyən edir.
  • ASCII ilə uyğun deyil: UTF-16 faylını ASCII və ya UTF-8 gözləyən redaktorda açsanız, bir çox sıfırlar və qəribə işarələr görəcəksiniz.

UTF-16 nə vaxt istifadə olunmalıdır?

  • Çox spesifik sistemlər və ya məhz UTF-16 tələb edən fayllarla işləyirsinizsə (məsələn, Windows‑proqramları ilə inteqrasiya).
  • Adi tətbiqlər və fayllar üçün — UTF-8 daha uyğundur.

4. ISO-8859-1 (Latin-1) — keçmişdən salam

ISO-8859-1, yaxud Latin-1 — ötən əsrin uzaq 80‑ci illərində yaradılmış birbaytlı kodlaşdırmadır. O, 256 simvolu dəstəkləyir: ingilis əlifbası, Qərbi Avropa dillərinin diakritikalı hərfləri (é, ü, ç və s.), durğu işarələri, xüsusi simvollar.

Fakt: Bu kodlaşdırmada kiril, yunan, ərəb, çin və digər qeyri‑latın simvolları yoxdur.

ISO-8859-1 harada rast gəlinir?

  • Köhnə fayl və proqramlarda (xüsusən Avropada).
  • Bəzi verilənlər bazalarında və protokollarda “susmaya görə”.
  • HTTP‑başlıqlarda (standarta görə kodlaşdırması göstərilməyən mətn ISO-8859-1 sayılır, baxmayaraq ki, praktikada bu, nadirdir).

Nümunə: ISO-8859-1-də sətir necə görünür

Simvol Unicode-da kod ISO-8859-1 (bayt) Şərh
A
U+0041
41
ASCII ilə eyni
é
U+00E9
E9
Fransız dili
ü
U+00FC
FC
Alman dili
Ya
U+042F
— Belə simvol yoxdur!

Java-da istifadə nümunəsi

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

public class Latin1Demo {
    public static void main(String[] args) throws Exception {
        String text = "Bonjour, ça va? Café!"; // Fransızca mətn
        Files.write(Paths.get("latin1.txt"), text.getBytes(StandardCharsets.ISO_8859_1));

        // Faylı ISO-8859-1 ilə oxumaq
        String read = Files.readString(Paths.get("latin1.txt"), StandardCharsets.ISO_8859_1);
        System.out.println(read); // Hər şey düzgün oxunur!

        // Gəlin kiril simvollarını yazmağa cəhd edək
        String cyrillic = "\u041F\u0440\u0438\u0432\u0435\u0442, \u043C\u0438\u0440!";
        try {
            Files.write(Paths.get("badlatin1.txt"), cyrillic.getBytes(StandardCharsets.ISO_8859_1));
        } catch (Exception e) {
            System.out.println("Xəta: ISO-8859-1-ə kiril simvollarını yazmaq mümkün deyil!");
        }
    }
}

ISO-8859-1 (Latin-1) kodlaşdırması yalnız Qərbi Avropa simvollarını dəstəkləyir — məsələn, fransız, alman və ya ispan dillərindəki vurğulu hərflər. Buna görə də fransız mətni problemsiz yazılır və oxunur.

Lakin bu kodlaşdırmada kiril əlifbası yoxdur və onu yazmağa cəhd etdikdə xəta və ya simvolların itməsi baş verir. Məhz buna görə çoxdilli mətnlər üçün daha geniş simvol dəstini əhatə edən UTF-8 və ya UTF-16 istifadə etmək daha yaxşıdır.

ISO-8859-1-in xüsusiyyətləri

  • Dillər üzrə məhdudiyyət: yalnız Qərbi Avropa dilləri.
  • Hər simvola 1 bayt: yığcamdır, amma çox məhduddur.
  • “Yad” simvolların yazılması təhrifə gətirir: kiril və ya heroqlifləri saxlamağa çalışsanız, onlar sual işarələrinə və ya “zibil”ə çevriləcək.

ISO-8859-1 nə vaxt istifadə olunmalıdır?

  • Yalnız çox köhnə sistem və ya verilənlər bazası ilə inteqrasiya edirsinizsə və məhz bu kodlaşdırma tələb olunursa.
  • Müasir tapşırıqlar üçün — tövsiyə edilmir.

5. Faydalı nüanslar

Kodlaşdırmaların müqayisə cədvəli

Kodlaşdırma Simvola görə bayt Hansı dillər ASCII ilə uyğunluq Harada istifadə olunur
UTF-8
1-4 Hamısı Tam Veb, Java, JSON, XML, Linux
UTF-16
2 və ya 4 Hamısı Yoxdur Java daxilində, Windows, XML
ISO-8859-1
1 Qərbi Avropa Tam Köhnə proqramlar, bazalar, HTTP

Kodlaşdırmanı necə seçmək olar?

  • UTF-8 — tapşırıqların 99%-i üçün seçiminiz. ASCII ilə uyğundur, bütün dilləri dəstəkləyir, ingilis mətni üçün minimal ölçü, veb və Java standartı.
  • UTF-16 — yalnız spesifikasiya tələb edirsə və ya Windows‑proqramları ilə inteqrasiya üçün istifadə edin.
  • ISO-8859-1 — yalnız köhnə sistemlərlə geriyə uyğunluq üçün. Heç vaxt kiril, yunan, ərəb və s. saxlamaq üçün istifadə etməyin.

Faylın hansı kodlaşdırmada olduğunu necə bilmək olar?

  • Kodlaşdırmanı göstərən redaktorda faylı açın (məsələn, Notepad++, VS Code).
  • Əgər “qarışıq, anlaşılmaz simvollar” görürsünüzsə, faylı başqa kodlaşdırmada açmağa cəhd edin.
  • Linux terminalında file fayl_adı komandasından istifadə edə bilərsiniz — bəzən kodlaşdırmanı göstərir.

Java-da kodlaşdırmanı necə təyin etmək olar?

java.nio.charset paketindən siniflərdən istifadə edin:

  • StandardCharsets.UTF_8
  • StandardCharsets.UTF_16
  • StandardCharsets.ISO_8859_1

Və ya kodlaşdırmanın adı ilə:

Charset windows1251 = Charset.forName("Windows-1251");
Charset utf8 = Charset.forName("UTF-8");

6. Təcrübə: kodlaşdırmanı səhv salanda nə baş verir?

Gəlin kiçik bir eksperiment edək. Sətiri UTF-8-də yazaq, sonra onu ISO-8859-1 kimi oxumağa cəhd edək:

import java.nio.file.*;
import java.nio.charset.*;

public class EncodingMismatchDemo {
    public static void main(String[] args) throws Exception {
        String text = "\u041F\u0440\u0438\u0432\u0435\u0442, \u043C\u0438\u0440!"; // Kiril əlifbası

        // UTF-8 kimi yazırıq
        Files.write(Paths.get("utf8demo.txt"), text.getBytes(StandardCharsets.UTF_8));

        // ISO-8859-1 kimi oxuyuruq (YANLIŞ!)
        String wrong = Files.readString(Paths.get("utf8demo.txt"), StandardCharsets.ISO_8859_1);
        System.out.println("Yanlış oxunuş: " + wrong);

        // İndi isə düzgün oxuyuruq
        String correct = Files.readString(Paths.get("utf8demo.txt"), StandardCharsets.UTF_8);
        System.out.println("Düzgün oxunuş: " + correct);
    }
}

Nəticə:

  • Birinci halda “qarışıq simvollar” — qəribə işarələr görəcəksiniz.
  • İkinci halda — normal rusdilli mətn.

7. Kodlaşdırmalarla iş zamanı tipik səhvlər

Səhv №1: Faylı yanlış kodlaşdırmada oxumaq. Əgər fayl UTF-8-də yazılıb, siz isə onu ISO-8859-1 və ya Windows-1251 kimi oxuyursunuzsa, bütün qeyri‑ASCII simvollar “zibil”ə çevriləcək. Bu, klassik hekayədir: “məndə hər şey işləyir, amma həmkarımda — yox”.

Səhv №2: “Yad” simvolları birbaytlı kodlaşdırmaya yazmağa cəhd. ISO-8859-1-də kiril və ya heroqlifləri saxlamağa çalışsanız, Java onları sual işarələrinə çevirəcək və ya xəta verəcək. Məlumatlar geri qaytarılmadan itiriləcək.

Səhv №3: “Susmaya görə” sistem kodlaşdırmasından istifadə. Java-da bəzi metodlarda (məsələn, new FileReader("file.txt")) kodlaşdırma açıq göstərilmir — sisteminki istifadə olunur. Bir kompüterdə bu, UTF-8 ola bilər, digərində — Windows-1251, üçüncüsündə isə ümumiyyətlə daha ekzotik nəsə. Buna görə həmişə kodlaşdırmanı açıq göstərməyə imkan verən metodlardan istifadə edin.

Səhv №4: UTF-16 faylını UTF-8 kimi açmaq. UTF-16-da yazılmış faylı UTF-8 kimi açsanız, baytlar yanlış şərh olunduğuna görə bir çox sıfırlar və qəribə simvollar görəcəksiniz.

1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Kiril yazısını köhnə rabitə sistemi vasitəsilə göndərməyə cəhd 📟
Kiril yazısını köhnə rabitə sistemi vasitəsilə göndərməyə cəhd 📟
1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Dilçilik təcrübəsi: Müxtəlif kodlaşdırmalarda sözlərin çəkisi ⚖️
Dilçilik təcrübəsi: Müxtəlif kodlaşdırmalarda sözlərin çəkisi ⚖️
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION