IlmHamroh
JavaScript Full-stack/1-qism. Kompyuter, fayllar va terminal8/40-dars15 daqiqa
Mundarija (28)

Matn kodlash: ASCII, Unicode va UTF-8

Qisqacha: Kompyuter harfni emas, sonni saqlaydi. Unicode dunyodagi har bir belgiga bitta raqam beradi (masalan, A — U+0041). UTF-8 esa shu raqamni 1 dan 4 baytgacha joyga yozish qoidasi. Fayl bir kodlashda yozilib, boshqasida o'qilsa, "krakozyabra" (mojibake) chiqadi — shuning uchun hamma joyda UTF-8 ishlatiladi.

Bu darsda

  • Kompyuter matnni qanday qilib sonlarga aylantirishini tushuntira olasiz.
  • ASCII, Unicode va UTF-8 farqini aytib bera olasiz.
  • Oddiy so'z UTF-8 da necha bayt bo'lishini hisoblay olasiz.
  • Krakozyabra (mojibake) qayerdan chiqishini va uni qanday tuzatishni bilasiz.
  • O'zbekcha ', ʻ va ‘ belgilari nega har xil ekanini tushunasiz.

Oldin bilishingiz kerak: Nega 0 va 1: ikkilik sanoq sistemasi, O'lchov birliklari: KB, MB, GB, O'n oltilik sanoq sistemasi.

1. Nega bu kerak?

Tasavvur qiling: Malika eski kompyuterda sayt ochdi. Салом so'zi o'rniga ekranda Салом chiqdi. Sayt buzilganmi? Yo'q. Baytlar joyida, faqat ular noto'g'ri "o'qilgan".

Oldingi darslardan bilasiz: kompyuter faqat 0 va 1 ni saqlaydi. Demak, har bir harf avval songa aylanishi kerak. Qaysi harfga qaysi son to'g'ri kelishini kim hal qiladi? Yozgan va o'qigan dastur bir xil qoidani bilishi shartmi?

Bu darsda shu savollarga javob beramiz. Keyin HTML, JSON, baza va Telegram botlar bilan ishlaganda bu bilim har kuni kerak bo'ladi.

2. Harf — bu son: kodlash jadvali

2.1 Kelishuv g'oyasi

Maktabda do'stingiz bilan "maxfiy xat" o'ynaganmisiz? A — 1, B — 2, D — 3 deb kelishasiz. Keyin "3-1-..." deb yozasiz, do'stingiz jadvalga qarab o'qiydi.

Kompyuter ham aynan shunday ishlaydi. Har bir belgiga bitta son beriladi. Bu kelishuv kodlash (encoding) deyiladi. Kodlashni yozgan va o'qigan tomon bir xil jadvalni ishlatishi shart. Aks holda "3-1" boshqa so'z bo'lib o'qiladi.

2.2 ASCII: birinchi umumiy jadval

1960-yillarda AQShda ASCII (American Standard Code for Information Interchange — "axborot almashish uchun Amerika standart kodi") yaratildi. U 7 bit ishlatadi: 2⁷ = 128 ta belgi.

Kodlar Nima bor
0–31 va 127 Boshqaruv belgilari (Enter, Tab) — ekranda ko'rinmaydi
32 Bo'sh joy (probel)
48–57 Raqamlar 0–9
65–90 Katta harflar A–Z
97–122 Kichik harflar a–z

Qolgan kodlarda tinish belgilari turadi: !, ?, @, + kabilar.

Keling, "Ali" so'zini kodlab ko'ramiz:

Harf ASCII kodi Ikkilikda (1 bayt)
A 65 01000001
l 108 01101100
i 105 01101001

Diskda "Ali" — shunchaki uchta bayt: 65, 108, 105. Kompyuter ularni ekranga chiqarayotganda jadvalga qaraydi va harf chizadi.

Qiziq tomoni: katta va kichik harf orasidagi farq doim 32. A = 65, a = 97. Ikkilikda bu bitta bitning farqi, shuning uchun harfni katta-kichikka aylantirish kompyuter uchun juda tez.

Endi o'zingiz: "Oy" so'zida O = 79. Kichik y ning kodi nechchi? Ishora: Y = 89. Javob:

Tekshirib ko'ring: Diskda 48 degan bayt turibdi. Bu son 48 mi yoki boshqa narsami?

Javob

Matn fayli bo'lsa, bu 0 raqami belgisi (ASCII 48). Baytning o'zi hech narsani bildirmaydi — uni qanday o'qishimiz muhim. Bir xil bayt matnda harf, rasmda rang, dasturda son bo'lishi mumkin.

3. ASCII yetmay qoldi: kod sahifalari tartibsizligi

ASCII ingliz tili uchun yetarli edi. Lekin unda o', ş, kirill, arab yoki xitoy harflari yo'q.

Yechim sifatida 8-bit ishlatila boshlandi: 2⁸ = 256 ta joy. Qo'shimcha 128 ta joyni har mamlakat o'zicha to'ldirdi. Bunday jadvallar kod sahifasi (code page) deyiladi:

  • Windows-1251 — kirill harflari uchun.
  • Windows-1252 — G'arbiy Yevropa tillari uchun.
  • KOI8-R — eski rus tizimlari uchun.

Muammo shundaki, bir xil bayt turli jadvalda turli harf bo'ladi:

Bayt (hex) Windows-1252 da Windows-1251 da
C0 À (lotin A, urg'uli) А (kirill A)

Fayl ichida qaysi jadval ishlatilgani yozilmaydi. Shuning uchun Moskvada yozilgan xat Parijda ochilsa, harflar chalkashib ketardi. Dunyoga bitta umumiy jadval kerak edi.

Tekshirib ko'ring: Kod sahifalarining asosiy kamchiligi nima edi?

Javob

Har til uchun alohida jadval bor edi va bir xil bayt turli jadvalda turli harfni bildirardi. Faylning o'zida qaysi jadval ishlatilgani yozilmagani uchun o'qigan dastur adashishi oson edi.

4. Unicode: har belgiga bitta raqam

1991-yilda Unicode standarti chiqdi. Uning maqsadi: dunyodagi har bir belgiga — harf, raqam, iyeroglif, emoji — bitta takrorlanmas raqam berish.

Bu raqam kod nuqtasi (code point) deyiladi. U U+ bilan boshlanib, o'n oltilik (hex) sonda yoziladi:

Belgi Kod nuqtasi Izoh
A U+0041 lotin A, o'nlikda 65 — ASCII bilan bir xil
А U+0410 kirill A — ko'rinishi bir xil, raqami boshqa
ʻ U+02BB o'zbek rasmiy imlosidagi tutuq belgisi
😀 U+1F600 kulib turgan yuz

U+0041 dagi 41 — hex son. O'n oltilik sanoq sistemasi darsidan eslang: hex 41 = 4 × 16 + 1 = 65.

Unicode 17.0 (2025-yil) da 159 000 dan ortiq belgi bor. Umumiy sig'im esa 1 114 112 ta joy, ya'ni hali ko'p bo'sh joy qolgan.

4.1 Unicode — bu hali "saqlash usuli" emas

Bu yerda ko'p odam adashadi. Unicode faqat "qaysi belgiga qaysi raqam" degan ro'yxat. Raqamni diskka necha baytda yozish — alohida masala.

O'xshatish: pochta orqali sovg'a yuboryapsiz. Sovg'aning o'zi — kod nuqtasi. Uni qanday qutiga solish — kodlash. Kichik sovg'ani kichik qutiga, kattasini katta qutiga solish mumkin. Keyingi bo'limdagi UTF-8 aynan shunday "qadoqlash qoidasi".

Tekshirib ko'ring: Lotin A va kirill А ekranda bir xil ko'rinadi. Kompyuter uchun ular bir xilmi?

Javob

Yo'q. Lotin A — U+0041, kirill А — U+0410. Raqamlari boshqa, demak kompyuter uchun bu ikki xil belgi. Shuning uchun lotin va kirill harflari aralashgan so'zni qidiruv topa olmaydi.

5. UTF-8: raqamni baytlarga joylash

5.1 Nega hamma belgiga 4 bayt bermaymiz?

Eng katta kod nuqtasi 4 baytga sig'adi. Hamma belgiga 4 bayt berish mumkin — bu usul UTF-32 deyiladi. Lekin unda "Salom" so'zi 5 bayt o'rniga 20 bayt bo'lardi. Internetdagi matnlarning katta qismi lotin harflari va HTML teglaridan iborat. Ular 4 barobar og'irlashib ketardi.

5.2 UTF-8 qanday ishlaydi

UTF-8 — o'zgaruvchan uzunlikdagi kodlash. Kod nuqtasi kichik bo'lsa — kam bayt, katta bo'lsa — ko'proq bayt:

Kod nuqtalari Bayt Misollar
U+0000–U+007F 1 ASCII: A, z, 7, '
U+0080–U+07FF 2 kirill Б, arab, ʻ, é
U+0800–U+FFFF 3 xitoycha 中, €, ‘
U+10000 va yuqori 4 emoji 😀, bayroq qismlari

UTF-8 ning eng aqlli tomoni: birinchi 128 belgi ASCII bilan bayt-baytigacha bir xil. Demak, har qanday eski ASCII fayl avtomatik ravishda to'g'ri UTF-8 fayl hamdir.

Kirill Б harfining yo'li mana bunday:

flowchart LR
  A["Belgi: Б"] --> B["Unicode raqami: U+0411"]
  B --> C["UTF-8 baytlari: D0 91"]
  C --> D["Diskda: 11010000 10010001"]

Bugun internetdagi saytlarning 98% dan ortig'i UTF-8 da. JSON, Linux, Git, zamonaviy Windows dasturlari ham standart sifatida UTF-8 ni ishlatadi.

5.3 Bosqichli misol: so'z necha bayt?

To'liq yechilgan misol — "Olma" va Салом:

So'z Harflar Har harf Jami bayt
Olma 4 1 bayt (ASCII) 4
Салом 5 2 bayt (kirill) 10

Ko'ryapsizmi: harflar soni deyarli bir xil, lekin hajm ikki barobar farq qiladi.

Endi qisman yechilgan misol. Toshkent 8 ta lotin harfi. Kirillchada Тошкент esa 7 harf. Kirill harfi 2 bayt bo'lsa, Тошкент necha bayt? Javob:

Mustaqil savol mashqlar bo'limida bor.

5.4 Qisqacha: UTF-16 va BOM

Yana ikki atamani uchratasiz, shuning uchun hozir tanishib qo'yamiz.

UTF-16 — har belgini 2 yoki 4 baytda saqlaydigan kodlash. Windows ichkarida va JavaScript tili matnni xotirada shunday saqlaydi. Emoji UTF-16 da ikki bo'lakka bo'linadi. Buni JavaScript kursida Unicode va emoji darsida batafsil ko'ramiz.

BOM (Byte Order Mark — "bayt tartibi belgisi") — fayl boshiga qo'yiladigan ko'rinmas belgi. UTF-8 da u uch bayt: EF BB BF. Ba'zi dasturlar (masalan, Windows'dagi Excel) shu belgiga qarab "bu UTF-8" deb taniydi. Lekin ko'p dasturlar BOM'ni kutmaydi va xato beradi — buni "Ko'p uchraydigan xatolar" bo'limida ko'ramiz.

Maslahat: Dasturchi uchun standart tanlov — UTF-8, BOM'siz. VS Code (kod yozish dasturi) oynasining pastki o'ng burchagida faylning kodlashi yozilgan ("UTF-8"). Uni bossangiz, faylni boshqa kodlashda qayta ochish yoki saqlash mumkin.

Tekshirib ko'ring: Nega "Olma" UTF-8 da 4 bayt, UTF-32 da esa 16 bayt?

Javob

UTF-8 ASCII harflarga 1 baytdan beradi: 4 × 1 = 4. UTF-32 esa har qanday belgiga 4 baytdan beradi: 4 × 4 = 16. Shuning uchun lotin matni uchun UTF-8 to'rt barobar tejamkor.

6. Krakozyabra (mojibake) qayerdan chiqadi?

Mojibake (yaponcha "buzilgan belgilar") yoki xalq tilida "krakozyabra" — matn bir kodlashda yozilib, boshqasida o'qilganda chiqadigan tushunarsiz belgilar.

Darsning boshidagi holatni qadamma-qadam ko'ramiz:

  1. Dastur Салом ni UTF-8 da saqladi: D0 A1 D0 B0 D0 BB D0 BE D0 BC (10 bayt).
  2. Boshqa dastur bu faylni Windows-1251 deb o'yladi.
  3. U har baytni alohida harf deb o'qidi: D0 → Р, A1 → Ў, D0 → Р, B0 → °. Natijada 10 bayt 10 ta harfga aylandi.
  4. Natija: Салом.

Xuddi shu baytlarni Windows-1252 deb o'qisa — Салом chiqadi. Teskari holat ham bor. Fayl Windows-1251 da saqlangan, UTF-8 deb o'qildi. Bunda baytlar UTF-8 qoidasiga to'g'ri kelmaydi va ekranda ����� chiqadi. � — "bu baytni o'qiy olmadim" degan maxsus belgi (U+FFFD).

Ekranda ko'rsangiz Ehtimoliy sabab
Салом UTF-8 matn Windows-1251 deb o'qildi
Салом, é UTF-8 matn Windows-1252 deb o'qildi
����� UTF-8 bo'lmagan matn UTF-8 deb o'qildi

Tuzatish qoidasi bitta: yozgan ham, o'qigan ham bir xil kodlashni ishlatsin. Amalda — hamma joyda UTF-8. HTML sahifada buni <meta charset="utf-8"> qatori bildiradi. Uni Hujjat skeleti darsida yozamiz.

Tekshirib ko'ring: Mojibake'da baytlar o'zgarib ketadimi?

Javob

Yo'q. Baytlar joyida qoladi, faqat noto'g'ri jadval bilan o'qiladi. Shuning uchun faylni to'g'ri kodlashda qayta ochsangiz (VS Code'da "Reopen with Encoding"), matn tiklanadi. Lekin buzilgan ko'rinishni qayta saqlab qo'ysangiz, endi baytlar ham buziladi.

7. Belgi har doim bitta "harf" emas

Ekranda bitta ko'ringan belgi ichkarida bir nechta kod nuqtasidan iborat bo'lishi mumkin:

Ko'rinishi Kod nuqtalari UTF-8 bayt
😀 1 ta 4
🇺🇿 (bayroq) 2 ta: "U" va "Z" harf-belgilari 8
👨‍👩‍👧 (oila) 5 ta: 3 odam + 2 ta "yopishtiruvchi" 18

Ko'zga bitta ko'rinadigan belgi grafema (grapheme) deyiladi. O'zbekiston bayrog'i — aslida ikki belgi: "U" va "Z" ga o'xshash maxsus belgilar yonma-yon turadi. Telefon ularni birga ko'rib, bayroq chizadi.

Buni o'zingiz tekshirib ko'ring. Quyidagi JavaScript kodini hali tushunish shart emas — JavaScript'ni kursda alohida qismda o'rganamiz. Faqat "Ishga tushir" tugmasini bosing. Har qatordagi // dan keyin natija yozilgan:

js
const kodlovchi = new TextEncoder(); // UTF-8 ga o'giruvchi

console.log("A".codePointAt(0)); // 65
console.log(kodlovchi.encode("A").length); // 1
console.log(kodlovchi.encode("Б").length); // 2
console.log(kodlovchi.encode("ʻ").length); // 2
console.log(kodlovchi.encode("😀").length); // 4
console.log(kodlovchi.encode("🇺🇿").length); // 8

Xulosa: matndagi belgilar soni va uning bayt hajmi har doim ham teng emas.

Tekshirib ko'ring: Telegram kanal nomi uchun "32 belgi" cheklovi bor, deylik. Bayroq emojisi nechta belgi bo'lib sanalishi mumkin?

Javob

Dasturga qarab: grafema bo'yicha sanasa — 1 ta, kod nuqtasi bo'yicha — 2 ta, UTF-16 bo'yicha — 4 ta. Shuning uchun "belgilar soni" deganda nimani sanayotganini doim aniqlash kerak.

8. O'zbek apostrofi: uchta o'xshash belgi

o' va g' harflarida ishlatiladigan belgi klaviaturada uch xil bo'lishi mumkin:

Belgi Kod nuqtasi UTF-8 Qayerdan keladi
' U+0027 1 bayt Oddiy klaviatura tugmasi
ʻ U+02BB 2 bayt Rasmiy imlo, o'zbek klaviatura sxemasi
‘ U+2018 3 bayt Word va telefon avtomatik almashtiradi

Uchalasi ekranda deyarli bir xil. Lekin kompyuter uchun bo'lim, boʻlim va bo‘lim — uch xil so'z. Foydalanuvchi bo'lim deb qidirsa, boʻlim yozilgan maqolani topmaydi.

Real loyihalarda buni ikki yo'l bilan hal qilishadi:

  1. Bitta belgini tanlash. IlmHamroh butun kursda oddiy ' ni ishlatadi.
  2. Saqlashdan oldin tozalash. Foydalanuvchi yozgan matndagi ʻ va ‘ ni dastur bitta shaklga almashtiradi.

Diqqat: Kodda apostrof yana bir muammo tug'diradi. Ko'p tillarda matn '...' ichiga yoziladi. 'O'zbekiston' deb yozsangiz, dastur matn 'O' da tugadi deb o'ylaydi. Buni JavaScript darslarida qanday hal qilishni ko'rasiz.

Tekshirib ko'ring: oʻqish so'zi (rasmiy ʻ bilan) UTF-8 da necha bayt?

Javob

7 bayt. o, q, i, s, h — 5 ta ASCII harf, har biri 1 bayt. ʻ esa 2 bayt. Jami 5 + 2 = 7. Oddiy ' bilan yozilsa — 6 bayt bo'lardi.

9. Ko'p uchraydigan xatolar

9.1 Excel'da CSV fayl krakozyabra bo'lib ochiladi

Dasturingiz ro'yxatni UTF-8 da CSV faylga yozdi (CSV — jadvalni oddiy matn ko'rinishida saqlash formati, CSV darsida o'rganamiz). Windows'dagi Excel uni ochganda Toshkent joyida, lekin Тошкент o'rnida Тошкент chiqadi.

Sababi: BOM bo'lmasa, Excel faylni eski Windows kod sahifasida o'qiydi. Yechim: Excel uchun mo'ljallangan CSV faylni "UTF-8 with BOM" qilib saqlang yoki Excel'da "Data → From Text/CSV" orqali UTF-8 ni tanlab oching.

9.2 BOM tufayli JSON o'qilmaydi

Kimdir sozlama faylini Windows Notepad'ning eski versiyasida "UTF-8 with BOM" qilib saqladi. Dastur uni o'qiganda shunday xato chiqadi:

text
SyntaxError: Unexpected token '', "{"a":1}" is not valid JSON

Tarjimasi: "Kutilmagan belgi: . Bu matn to'g'ri JSON emas". (JSON — dasturlar ma'lumot almashadigan matn formati, JSON darsida o'rganamiz.)

G'alati, to'g'rimi? Qo'shtirnoq ichida hech narsa ko'rinmayapti. Sababi — o'sha "ko'rinmas" belgi aynan BOM. Xato xabarida bo'sh yoki ko'rinmas belgi ko'rsangiz, faylning kodlashini tekshiring. VS Code'da pastki o'ng burchakdagi "UTF-8 with BOM" ni bosib, "Save with Encoding → UTF-8" ni tanlang.

9.3 � belgilari

Fayl eski Windows-1251 da saqlangan, siz esa UTF-8 deb ochdingiz. Kirill harflari o'rnida ���� chiqadi. Yechim: VS Code'da "Reopen with Encoding → Cyrillic (Windows 1251)" bilan oching, keyin "Save with Encoding → UTF-8" bilan qayta saqlang.

9.4 Belgilar sonini baytlar soni deb o'ylash

"Ism 50 baytdan oshmasin" degan cheklov qo'ydingiz. Lotincha 50 harfli ism sig'adi, kirillchada esa faqat 25 harf sig'adi. Cheklovni har doim nimada o'lchayotganingizni aniq yozing: belgida yoki baytda.

9.5 Uchta apostrofni aralashtirish

Bir faylda o', boshqasida oʻ yozilgan. Qidiruv yarim natijani topmaydi. Loyihada bitta belgini tanlang va unga amal qiling.

10. Mashqlar

1-mashq (oson): ASCII kodlari

D harfining ASCII kodi 68. Kichik d ning kodi nechchi? Ishora: katta va kichik harf farqi doim 32 (ASCII jadvalini eslang).

Javob:

Yechim

68 + 32 = 100. Kichik harflar katta harflardan 32 ta keyin turadi: A = 65 va a = 97 bo'lgani kabi.

2-mashq (o'rta): Baytlarni sanang

Uchta so'z UTF-8 da necha bayt bo'ladi? UTF-8 jadvalidan foydalaning: ASCII — 1 bayt, kirill va ʻ — 2 bayt.

  1. Samarqand (lotin, 9 harf)
  2. Самарқанд (kirill, 9 harf)
  3. gʻisht (rasmiy ʻ bilan)
Yechim
  1. 9 × 1 = 9 bayt.
  2. 9 × 2 = 18 bayt. қ ham kirill harfi, u ham 2 bayt.
  3. g, i, s, h, t — 5 bayt, ʻ — 2 bayt. Jami 7 bayt.

Bir xil ma'noli so'z yozuvga qarab ikki barobar ko'p joy olishi mumkin.

3-mashq (qiyin): Tashxis qo'ying

Jasur Telegram bot yozdi. Bot foydalanuvchi ismlarini faylga saqlaydi. Jasur faylni boshqa dasturda ochganda uch xil muammoni ko'rdi:

  1. Малика — Malika ismini kirillchada yozgan edi.
  2. ������ — boshqa bir faylda ism o'rnida faqat shu belgilar chiqdi.
  3. Oʻgʻiloy ismi qidiruvda O'g'iloy deb yozilganda topilmadi.

Har biriga sabab va yechim yozing.

Yechim
  1. Sabab: UTF-8 da saqlangan kirill matni Windows-1252 deb o'qildi (krakozyabra jadvalidagi Ð bilan boshlanadigan holat). Yechim: faylni UTF-8 da oching.
  2. Sabab: bu fayl eski Windows-1251 da yozilgan va UTF-8 deb o'qildi. � — "bu baytni o'qiy olmadim" belgisi. Yechim: faylni Windows-1251 da qayta oching, UTF-8 da saqlang. Bundan keyin fayl yozadigan dastur ham faqat UTF-8 ishlatsin.
  3. Sabab: ʻ (U+02BB) va ' (U+0027) — kompyuter uchun turli belgilar. Yechim: saqlash va qidirishdan oldin matndagi apostroflarni bitta shaklga keltirish.

11. Real ishda

  • HTML sahifalar: har sahifa <meta charset="utf-8"> bilan boshlanadi. Server ham Content-Type: text/html; charset=utf-8 sarlavhasini yuboradi.
  • Ma'lumotlar bazasi: PostgreSQL'da baza UTF8 kodlashda yaratiladi. MySQL'da eski utf8 turi faqat 3 baytgacha saqlaydi. Emoji saqlash uchun utf8mb4 kerak, aks holda Incorrect string value xatosi chiqadi.
  • SMS: faqat lotin harfli SMS'ga 160 belgi sig'adi. Bitta kirill harfi yoki emoji qo'shilsa, telefon boshqa kodlashga o'tadi va chegara 70 belgiga tushadi. SMS xizmatlari narxni shunga qarab hisoblaydi.
  • Intervyu savoli: "Unicode va UTF-8 farqi nima?" Javob: Unicode — belgilarga raqam beruvchi ro'yxat, UTF-8 — bu raqamlarni baytlarga yozish usuli.

Xulosa

  • Kompyuter harfni son sifatida saqlaydi. Harf va son orasidagi kelishuv — kodlash.
  • ASCII — 128 belgilik birinchi standart. Kod sahifalari esa har til uchun alohida jadval edi.
  • Unicode har belgiga bitta kod nuqtasi beradi: A — U+0041, 😀 — U+1F600.
  • UTF-8 bu raqamni 1–4 baytda saqlaydi va ASCII bilan to'liq mos. Standart tanlov — UTF-8, BOM'siz.
  • Krakozyabra — baytlar noto'g'ri kodlash bilan o'qilganining belgisi.
  • ', ʻ va ‘ — kompyuter uchun uch xil belgi. Loyihada bittasini tanlang.

Keyingi dars: Rasm, ovoz va video raqamli ko'rinishda — matndan keyin rasm, musiqa va video qanday qilib sonlarga aylanishini ko'ramiz.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Matn kodlash: ASCII, Unicode va UTF-8 — IlmHamroh