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 | |
|
| Ya | |
|
| € | |
|
| 😀 | |
|
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 | |
|
2 bayt |
| Ya | |
|
2 bayt |
| € | |
|
2 bayt |
| 😀 | |
|
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 | |
|
ASCII ilə eyni |
| é | |
|
Fransız dili |
| ü | |
|
Alman dili |
| Ya | |
— | 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 |
|---|---|---|---|---|
|
1-4 | Hamısı | Tam | Veb, Java, JSON, XML, Linux |
|
2 və ya 4 | Hamısı | Yoxdur | Java daxilində, Windows, XML |
|
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.
GO TO FULL VERSION