UTF-8 kodlaşdırmasında hər Unicode kod nöqtəsi 1 ilə 4 bayt arası yer tutur. Adi Latın hərfləri, rəqəmlər və boşluq 1 bayt tutur. Azərbaycan dilinə xas ə, ş, ğ, ı kimi hərflər 2 bayt, manat işarəsi ₼ 3 bayt, 😀 kimi emoji isə 4 baytdır. Ekranda bir işarə kimi görünən bəzi emoji birləşmələri isə bir neçə kod nöqtəsindən ibarətdir və daha çox bayt tutur.
Buna görə Azərbaycan dilində yazılmış mətnin bayt sayı adətən simvol sayından bir qədər çox olur. Fərqin nə qədər olacağı mətndəki xüsusi hərflərin, işarələrin və emojilərin sayından asılıdır. Cədvəllərdəki bayt aralıqları UTF-8 standartından götürülüb, söz və hərf nümunələrini isə özümüz ölçmüşük.
RFC 3629 üzrə UTF-8 bayt aralıqları
Simvolun UTF-8-də neçə bayt tutacağını onun Unicode kod nöqtəsi müəyyən edir. UTF-8 standartını təsvir edən RFC 3629 sənədinin 3-cü bölməsində kod nöqtələri dörd aralığa bölünür.
| Kod nöqtəsi aralığı | UTF-8-də bayt sayı | Nümunə |
|---|---|---|
| U+0000 ilə U+007F arası | 1 | a, Z, 7, boşluq |
| U+0080 ilə U+07FF arası | 2 | ə, ş, ç, ğ, ı |
| U+0800 ilə U+FFFF arası | 3 | ₼ |
| U+10000 ilə U+10FFFF arası | 4 | 😀 |
ASCII simvolları birinci aralığa düşür, ona görə də hər biri bir bayt tutur. Boşluq da ASCII simvoludur və 1 bayt tutur. Azərbaycan əlifbasının xüsusi hərfləri ikinci aralıqdadır. Manat işarəsi üçüncü, emoji isə dördüncü aralığa aiddir.
Azərbaycan hərfləri və sözləri neçə baytdır
Azərbaycan əlifbasında ASCII-də olmayan hərflər kiçik ç, ə, ğ, ı, ö, ş, ü və böyük Ç, Ə, Ğ, İ, Ö, Ş, Ü hərfləridir. Bu hərflərin hər biri UTF-8-də 2 bayt tutur. Qalan hərflər, o cümlədən i və I, adi Latın hərfləridir və bir baytla yazılır.
Aşağıdakı nümunələri 29 oktyabr 2026-cı ildə Python 3.13-də len(s.encode('utf-8')) ifadəsi ilə ölçdük. Simvol sütununda kod nöqtələrinin sayı göstərilir.
| Mətn | Simvol | UTF-8 bayt | Fərqin səbəbi |
|---|---|---|---|
| Salam | 5 | 5 | Bütün hərflər ASCII-dir |
| Ərzaq | 5 | 6 | Ə hərfi 2 bayt tutur |
| Bakı 2026 | 9 | 10 | ı hərfi 2 bayt, boşluq və rəqəmlər 1 bayt tutur |
| Gəncə | 5 | 7 | Sözdə iki ə var |
| ₼ | 1 | 3 | Üçüncü aralığa aiddir |
| 😀 | 1 | 4 | Dördüncü aralığa aiddir |
Buradan sadə bir qayda çıxır. Hər xüsusi Azərbaycan hərfi bayt sayını 1 artırır, ₼ işarəsi 2, 😀 kimi tək kod nöqtəli emoji isə 3 artırır. «Gəncə» sözündə iki ə olduğu üçün 5 simvol 7 bayt edir.
Azərbaycan hərflərinin UTF-8 baytları onaltılıq yazılışda
UTF-8-də 2 baytlıq hər hərf iki ayrı bayt kimi saxlanılır. Proqramçılar bu baytları adətən onaltılıq say sistemində görürlər. Cədvəldəki dəyərləri də Python 3.13-də ch.encode('utf-8') ilə almışıq.
| Hərf | Kod nöqtəsi | UTF-8 baytları | Bayt sayı |
|---|---|---|---|
| ə | U+0259 | C9 99 | 2 |
| Ə | U+018F | C6 8F | 2 |
| ı | U+0131 | C4 B1 | 2 |
| İ | U+0130 | C4 B0 | 2 |
| ğ | U+011F | C4 9F | 2 |
| ş | U+015F | C5 9F | 2 |
| ç | U+00E7 | C3 A7 | 2 |
| ö | U+00F6 | C3 B6 | 2 |
| ü | U+00FC | C3 BC | 2 |
Diqqət etsəniz, ı, İ və ğ hərflərinin birinci baytı eynidir (C4), fərq yalnız ikinci baytdadır. Eyni şey ç, ö və ü hərflərinə də aiddir, üçü də C3 baytı ilə başlayır. Ə ilə ə isə tamamilə fərqli baytlarla yazılır, çünki onların kod nöqtələri bir-birinə yaxın deyil.
Simvol sayı ilə bayt sayı niyə fərqlənir
Simvol sayı mətndə neçə işarə olduğunu, bayt sayı isə bu işarələrin seçilmiş kodlaşdırmada neçə baytla ifadə olunduğunu göstərir. Proqramın əməli yaddaşında mətnin tutduğu yer bundan fərqli ola bilər. Mətn yalnız ASCII simvollarından ibarətdirsə, bu iki rəqəm üst-üstə düşür. Mətnə Azərbaycan hərfləri, ₼ və ya emoji əlavə olunanda bayt sayı artır. Bundan başqa elə hallar da var ki, ekranda eyni görünən mətn fərqli sayda bayt tutur.
Eyni görünən hərf iki cür kodlaşdırıla bilər
Unicode-da bir hərf ya hazır, birləşmiş simvol kimi, ya da əsas hərf və ona qoşulan ayrıca işarə kimi yazıla bilər. Bu iki yazılış Unicode-un UAX #15 sənədində NFC və NFD normallaşdırma formaları kimi təsvir olunur. Ekranda nəticə eyni görünür, amma ikinci variantda kod nöqtələri, deməli baytlar da daha çox olur. Bəzi mənbələrdən kopyalanan mətn belə ayrışmış formada gələ bilər.
Oxşar vəziyyət Unicode-un böyük və kiçik hərf qaydalarında da yaranır. SpecialCasing.txt faylına görə İ hərfinin ümumi, dildən asılı olmayan kiçik forması i hərfi ilə ona birləşən üst nöqtədir (U+0069 və U+0307). Bu, bir yox, iki kod nöqtəsidir. Bunlardan i 1 bayt tutur, U+0307 isə RFC 3629 cədvəlinə görə 2 baytlıq aralığa düşür. Nəticədə adi i hərfinə bənzəyən bu birləşmə 1 əvəzinə 3 bayt tutur.
İ və ı hərflərində böyük və kiçik hərf çevrilməsi bayt sayını dəyişir
Həmin SpecialCasing faylında «Turkish and Azeri» adlı ayrıca bölmə var və orada «az» kodu ilə Azərbaycan dili üçün xüsusi qaydalar verilib. Bu qaydalara görə çevrilmə belə aparılır.
- Böyük İ kiçik hərfə çevriləndə i olur (U+0130 əvəzinə U+0069). Bayt sayı 2-dən 1-ə enir.
- Azərbaycan dilinin hərf çevirmə qaydaları tətbiq olunanda böyük I kiçik hərfə çevriləndə ı olur (U+0049 əvəzinə U+0131). Bayt sayı 1-dən 2-yə qalxır.
- Kiçik i böyük hərfə çevriləndə İ olur. Bayt sayı 1-dən 2-yə qalxır.
Deməli, Azərbaycan dilində eyni sözü böyük hərflərlə yazmaq bayt sayını dəyişə bilər. Məsələn, «iki» sözü 3 bayt, «İKİ» isə 5 bayt tutur. Proqram dil qaydasını nəzərə almadan çevirmə aparırsa, İ hərfi ümumi qaydaya görə i və üst nöqtəyə çevrilir və mətn yenə fərqli sayda bayt tutur.
Məktəbdə öyrədilən 1 və 2 bayt qaydası UTF-8-də necə işləyir
Məktəbdə adətən 1 baytın 8 bit olduğu, bir simvolun ASCII-də 1 bayt, Unicode-da isə 2 bayt tutduğu öyrədilir. 1 bayt = 8 bit bərabərliyi doğrudur. «Unicode-da 2 bayt» cavabı isə yalnız müəyyən bir kodlaşdırmaya uyğun gəlir.
Bu cavab UTF-16 kodlaşdırmasındakı vəziyyətə uyğun gəlir. RFC 2781 sənədinin 2.1 bölməsinə görə U+10000-dən kiçik kod nöqtələri UTF-16-da bir 16 bitlik ədədlə, yəni 2 baytla yazılır. Daha böyük kod nöqtələri, məsələn emoji, iki 16 bitlik ədəddən ibarət surroqat cüt tələb edir və 4 bayt tutur.
UTF-8-də isə simvolun sabit uzunluğu yoxdur. RFC 3629-a görə simvol 1 ilə 4 bayt arası yer tutur. Ona görə «Unicode-da 2 bayt» fikri yalnız UTF-16 üçün və yalnız U+10000-dən aşağı simvollar üçün doğrudur. UTF-8-də ASCII hərfi 1, ə hərfi 2, emoji isə 4 bayt tutur.
UTF-8, UTF-16 və Windows kod səhifələrində eyni mətnin ölçüsü
Eyni mətn seçilmiş kodlaşdırmadan asılı olaraq yaddaşda fərqli yer tutur. «Bakı şəhəri» ifadəsini (11 simvol) üç kodlaşdırmada müqayisə etdik.
| Kodlaşdırma | Bir simvola düşən bayt | «Bakı şəhəri» ölçüsü |
|---|---|---|
| UTF-8 | 1 ilə 4 arası | 15 bayt |
| UTF-16 | U+10000-dən aşağı 2, yuxarı 4 | 22 bayt (BOM olmadan) |
| Windows-1254 | 1 | Saxlanıla bilməz, ə və Ə hərfləri yoxdur |
Bu ifadədə ən çox yeri UTF-16 tutur, çünki ASCII hərfləri də daxil olmaqla hər simvol 2 bayt olur. UTF-8 ASCII hərflərini bir baytda saxladığı üçün Latın qrafikalı Azərbaycan mətnində adətən daha az yer tutur.
Windows-1254 və Windows-1251 kod səhifələrində dəstəklənən hər simvol bir baytla yazılır, amma bu kod səhifələri bütün Unicode simvollarını əhatə etmir. Unicode Konsorsiumunun dərc etdiyi uyğunluq fayllarında 0x00 ilə 0xFF arasındakı baytların demək olar ki, hamısı bir Unicode simvolu ilə uyğunlaşdırılır. İstisnalar da var, Windows-1251 faylında 0x98, Windows-1254 faylında isə yeddi bayt təyin olunmayıb. Windows-1254 faylında ı (0xFD), İ (0xDD), ğ (0xF0), ş (0xFE) və ç (0xE7) var, amma ə (U+0259) yoxdur. Buna görə Azərbaycan mətni bu kod səhifəsində tam saxlanıla bilməz. Windows-1251 faylında isə Kiril hərfləri bir baytla yazılır. Məsələn, 0xC0 baytı А, 0xE0 baytı а, 0xA8 baytı isə Ё hərfinə uyğundur.
Mətndə ç və É™ kimi qəribə simvollar niyə görünür
Mətndə «Bakı ÅŸÉ™hÉ™ri» kimi anlaşılmaz simvollar görünürsə, bu, adətən UTF-8 ilə saxlanmış mətnin tək baytlıq kod səhifəsi ilə oxunduğunu göstərir. Belə pozulmuş görüntüyə mojibake da deyilir. UTF-8-də 2 bayt tutan Azərbaycan hərflərinin əksəriyyəti bu halda iki ayrı simvol kimi oxunur. Yuxarıdakı nümunə «Bakı şəhəri» ifadəsinin UTF-8 baytları Windows-1252 kod səhifəsində oxunanda alınır. Nəticəni Python 3.13 ilə hesabladıq.
| Hərf | UTF-8 baytları | Windows-1252-də oxunanda |
|---|---|---|
| ə | C9 99 | É™ |
| Ə | C6 8F | 0x8F baytı Windows-1252-də müəyyən edilməyib |
| ı | C4 B1 | ı |
| ç | C3 A7 | ç |
| ş | C5 9F | ÅŸ |
| ğ | C4 9F | ÄŸ |
| ö | C3 B6 | ö |
| ü | C3 BC | ü |
Ekranda nə görünəcəyi baytların hansı kod səhifəsi ilə oxunmasından asılıdır. Cədvəldəki nəticə yalnız Windows-1252 üçün hesablanıb, başqa kod səhifəsində başqa cür pozulmuş görüntü alına bilər. Bu zaman baytların özü dəyişmir, sadəcə səhv şərh olunur. Ona görə baytlara toxunulmayıbsa, faylı yenidən UTF-8 kodlaşdırması ilə açanda mətn adətən düzgün görünür.
Mətn ölçüsü kalkulyatoru ilə mətnin neçə bayt olduğunu tapmaq
Öz mətninizin neçə bayt tutduğunu «Mətn ölçüsü kalkulyatoru» ilə tapa bilərsiniz. Digily Link bizim məhsulumuzdur, bu kalkulyator da digily.link saytındakı alətlərdən biridir.
- digily.link saytında «Mətn ölçüsü kalkulyatoru» səhifəsini açın.
- Mətninizi «Mətn» sahəsinə yazın və ya yapışdırın.
- «Ölçü» nəticəsinə baxın. Nəticə siz yazdıqca dərhal yenilənir, ayrıca düymə basmaq lazım deyil.
Hesablama brauzerinizdə aparılır və mətn serverə göndərilmir. Mətn heç bir dəyişikliyə uğramadan, yazdığınız kimi ölçülür. Proqramçılar üçün qeyd edək ki, alət ölçünü new Blob([text]).size ilə tapır, yəni mətnin UTF-8 bayt sayını göstərir.
Böyük mətnlərin ölçüsü B, KB, MB, GB və TB vahidləri ilə göstərilir. Burada 1 KB 1024 bayta bərabərdir (beynəlxalq ikilik vahidlərdə buna 1 KiB deyilir, onluq sistemdə isə 1 kB 1000 baytdır) və nəticə vergüldən sonra iki rəqəmədək yuvarlaqlaşdırılır. Keçid həddi də 1024 baytdır. Tam 1024 baytlıq mətn «1024 B» kimi görünür, 1025 baytdan başlayaraq isə nəticə KB ilə verilir və 1025 bayt «1 KB» kimi çıxır. Kilobaytı 1000 bayt kimi hesablayan proqramlarla müqayisə edərkən bu fərqi nəzərə alın.
Bayt limiti olan sahəyə Azərbaycan dilində mətn yerləşdirmək
Fərz edək ki, istifadə etdiyiniz sistemdə bir sahəyə ən çox 160 bayt yazmaq olar. Bu rəqəm şərtidir, heç bir konkret platformaya aid deyil və yalnız hesablamanı göstərmək üçün seçilib.
Yalnız ASCII simvollarından ibarət mətndə 160 bayt elə 160 simvol deməkdir. Azərbaycan dilində isə hər kiçik ç, ə, ğ, ı, ö, ş, ü və böyük Ç, Ə, Ğ, İ, Ö, Ş, Ü hərfi bir əlavə bayt tələb edir. Mətndə bu hərflərdən başqa yalnız adi simvollar varsa, sahəyə sığan simvol sayını tapmaq üçün 160-dan xüsusi hərflərin sayını çıxmaq kifayətdir. Məsələn, mətninizdə 20 xüsusi hərf varsa, sahəyə 140 simvol sığır, çünki 140 simvol və 20 əlavə bayt birlikdə 160 bayt edir. Azərbaycan mətnində hərflərin çoxu ASCII olduğu üçün mətn ASCII ilə yazılmış variantından cəmi bir qədər böyük alınır.
- Mətni «Mətn» sahəsinə yapışdırın və «Ölçü» nəticəsinə baxın. 1024 baytdan kiçik mətnlərin ölçüsü B ilə göstərilir, məsələn «152 B».
- Nəticə 160 B-dən çoxdursa, mətni qısaldın. Silinən hər adi hərf 1, hər ə və ya ş 2, ₼ işarəsi 3, emoji isə 4 bayt yer boşaldır.
- Sətir sonlarını da yoxlayın, çünki onlar da ölçüyə daxildir. UTF-8-də LF (\n) 1 bayt, Windows-da yayılmış CRLF (\r\n) isə 2 bayt tutur. Lazımsız boş sətirləri silsəniz, mətn bir qədər kiçilər.
- Son mətni hədəf sistemə daxil edib orada da yoxlayın. Bəzi sahələr limiti baytla deyil, simvol sayı ilə hesablayır.
Bayt hesablamasında nəzərə alınmalı məhdudiyyətlər
- Kalkulyator yalnız UTF-8 baytlarını sayır. Fayl Windows-1251, Windows-1254 və ya başqa kodlaşdırmada saxlanıbsa, onun ölçüsü göstərilən rəqəmdən fərqli ola bilər.
- Sətir sonları da mətnin bir hissəsidir və hesablamaya daxil edilir.
- Nəticə simvol sayı deyil, bayt sayıdır. Sistem limiti simvol sayı ilə qoyursa, sizə başqa rəqəm lazım olacaq.
- Ayrışmış formada kopyalanmış hərflər eyni görünən mətnin daha çox bayt tutmasına səbəb ola bilər. İ və ı hərflərində böyük və kiçik hərf çevrilməsi də bayt sayını dəyişir.
Mətninizin limitə sığıb-sığmadığını yoxlamaq üçün Mətn ölçüsü kalkulyatoru ilə mətninizin ölçüsünü baytla hesablayın.