6-bo‘lim

Matn - ASCII dan UTF-8 gacha

ASCII jadvali va uning qonuniyatlari, Unicode va UTF-8 kodlash qoidasi, noto'g'ri kodlash oqibatlari va belgi hamda bayt farqi.

🕑 9 daqiqa o‘qish 📄 1 339 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. ASCII - eng birinchi kelishuv
  2. Muammo: 128 ta belgi yetmaydi
  3. UTF-8 qoidasi
  4. Noto'g'ri kodlash
  5. Xulosa

Xotirada faqat sonlar bor. Demak harflar ham son bo'lishi kerak.

Qaysi son qaysi harfni anglatishi - bu kelishuv. Uning tarixi ham qiziq, oqibatlari ham.

ASCII - eng birinchi kelishuv #

ASCII atigi 7 bit ishlatadi, ya'ni 128 ta belgi. Ularning joylashuvi tasodifiy emas:

KodNima joylashgan
32-47bo'sh joy va tinish belgilari
48-57raqamlar 0 dan 9 gacha
65-90katta harflar A dan Z gacha
97-122kichik harflar a dan z gacha

Bu tartibdan ikkita foydali qonuniyat kelib chiqadi.

1. Katta va kichik harf orasidagi farq - aynan 32.

BelgiKodiIkkilikda
A6501000001
a9701100001

Faqat bitta bit farq qiladi - oltinchisi. Shuning uchun harfni katta-kichikka o'girish uchun shu bitni almashtirish kifoya, hech qanday jadval kerak emas.

2. Raqamlar ketma-ket joylashgan.

'0' ning kodi 48, '7' niki 55. Demak '7' belgisidan haqiqiy 7 sonini olish uchun 55 − 48 qilish yetarli.

Bu hiylalar bugun ham har bir kompilyator va har bir matn ishlovchi dasturda ishlatiladi.

Bu tasodif emas - ataylab shunday tanlangan

ASCII 1963-yilda ishlab chiqilgan va uning jadvali sinchkovlik bilan tuzilgan:

QonuniyatFoydasi
a va A farqi aynan 32 (bitta bit)Registr almashtirish - bitta XOR
Raqamlar ketma-ket, 48 danBelgini songa aylantirish - ayirish
Harflar alifbo tartibidaSaralash - oddiy taqqoslash
Boshqaruv belgilari 0-31 daUlarni bitta tekshiruv bilan ajratish

O'sha paytda har bir tranzistor qimmat edi. Shuning uchun kodlash apparatni soddalashtiradigan qilib tuzilgan.

Bugun ham >= '0' && <= '9' degan tekshiruv aynan shu tartibga tayanadi.

Muammo: 128 ta belgi yetmaydi #

O'zbek, rus, xitoy, arab - dunyoda minglab belgi bor. 7 bit ularni sig'dira olmaydi.

1980-1990-yillarda har mamlakat o'z jadvalini yasadi: cp1251 (kirillcha), cp1256 (arabcha), latin-1 va o'nlab boshqalar. Hammasi bir xil baytlarni turlicha o'qirdi.

Yechim - Unicode: har belgiga butun dunyo bo'ylab yagona raqam (kod nuqtasi) berish.

Lekin raqamni qanday saqlash kerak? Bu alohida savol va uning javobi - UTF-8.

UTF-8 qoidasi #

UTF-8: birinchi bayt uzunlikni aytadi 0xxxxxxx 1 bayt - ASCII bilan bir xil 110xxxxx 10xxxxxx 2 bayt - kirill, o'zbek tutuq belgisi 1110xxxx 10xxxxxx 10xxxxxx 3 bayt - xitoy, yapon 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 4 bayt - emoji Davomiy baytlar HAR DOIM 10 bilan boshlanadi - shuning uchun chegarani topish oson Bu xossa "o'z-o'zini sinxronlash" deb ataladi
Oqimning o'rtasidan boshlab ham belgi boshini topish mumkin

Turli belgilar turli hajm egallaydi:

BelgiKod nuqtasiBaytlarNechta bayt
AU+0041411
zU+007A7a1
ʻU+02BBca bb2
йU+0439d0 b92
ΩU+03A9ce a92
U+6587e6 96 873
🌍U+1F30Df0 9f 8c 8d4

Qanday qilib nechta bayt kelishini bilamiz? Birinchi baytning o'zi aytadi:

Birinchi bayt boshlanishiNechta bayt
0xxxxxxx1 (ASCII bilan bir xil)
110xxxxx2
1110xxxx3
11110xxx4

Davomi baytlar esa har doim 10xxxxxx bilan boshlanadi - shuning uchun ularni boshlanish bayti bilan adashtirib bo'lmaydi.

Bundan muhim amaliy oqibat chiqadi: belgilar soni va baytlar soni bir xil emas.

MatnBelgilarBaytlar
Salom, dunyo!1313
Oʻzbekiston1112

Ikkinchi qatorda ʻ belgisi ikki bayt egallagani uchun farq paydo bo'ldi.

UTF-8 ning uchta ajoyib xossasi

UTF-8 ni 1992-yilda Ken Tompson va Rob Payk o'ylab topishgan - rivoyatga ko'ra, restoran salfetkasida.

XossaNima uchun muhim
ASCII bilan mosEski matnlar o'zgarishsiz ishlaydi
O'z-o'zini sinxronlaydiBayt oqimining o'rtasidan boshlab ham belgi chegarasini topish mumkin
Bayt tartibi muhim emasEndianlik muammosi yo'q (7-bo'lim)

Ikkinchi xossa nozik: davomiy baytlar har doim 10 bilan boshlanadi, boshlang'ich bayt esa hech qachon 10 bilan boshlanmaydi. Shuning uchun istalgan joydan orqaga qarab belgi boshini topish mumkin.

Bugun veb sahifalarning 98% dan ortig'i UTF-8 da.

Diqqat: Oʻzbekiston da 11 belgi, lekin 12 bayt. Sabab - ʻ (tutuq belgisi) ikki bayt egallaydi.

Bu amaliy oqibat beradi: bazada VARCHAR(11) deb e'lon qilgan maydon bu so'zni sig'dirmasligi mumkin - agar uzunlik baytlarda o'lchansa.

Noto'g'ri kodlash #

ASCII doirasidagi matnda hamma kodlash bir xil ishlaydi:

BaytlarKodlashNatija
54 6f 73 68 6b 65 6e 74UTF-8Toshkent
o'sha baytlarlatin-1Toshkent
o'sha baytlarcp1251Toshkent

Lekin kirilcha matnda vaziyat butunlay o'zgaradi:

NimaQiymat
Asl matnТошкент
UTF-8 baytlarid0 a2 d0 be d1 88 d0 ba d0 b5 d0 bd d1 82
UTF-8 deb o'qisakТошкент
cp1251 deb o'qisakТошкент

Oxirgi qator - aynan o'sha tanish "krakozyabra". Baytlar buzilmagan; ular shunchaki noto'g'ri jadval bilan o'qilgan.

Baytlar haqiqatan noto'g'ri bo'lsa, uch xil yo'l tutish mumkin:

YondashuvNatija
Xato bilan to'xtatisho'qish bekor qilinadi
AlmashtirishSalom �� dunyo
E'tiborsiz qoldirishSalom dunyo

Uchinchisi xavfli: ma'lumot jimgina yo'qoladi va hech kim sezmaydi.

"Kodlashni o'zi aniqlaydi" degan narsa yo'q

Baytlarning o'zida "men UTF-8 man" degan ma'lumot yo'q. Kodlash har doim tashqaridan beriladi:

QayerdaQanday
HTTPContent-Type: text/html; charset=utf-8
HTML<meta charset="utf-8">
Ma'lumotlar bazasiJadval va ulanish kodlashi
FaylKelishuv yoki BOM
DasturFaylni ochishda aniq ko'rsatiladi

Eng ko'p uchraydigan xato - kodlashni umuman ko'rsatmaslik. U holda tizimning o'z kodlashi ishlatiladi, va shu sabab dastur bir kompyuterda ishlab, boshqasida matnni buzadi.

Shuning uchun kodlashni har doim aniq ko'rsating - bu bir qadam keyinchalik soatlab nosozlik qidirishdan qutqaradi.

Belgi, bayt va ko'rinadigan harf - uchta boshqa narsa

"🌍 ning uzunligi qancha?" degan savolga bitta to'g'ri javob yo'q - u nimani sanashingizga bog'liq:

Nimani sanaymizJavob
Kod nuqtalari1
UTF-16 birliklari2
Baytlar4

Turli dasturlash tillari shu uchtadan turlichasini tanlagan, shuning uchun bir xil matn turli joyda turlicha uzunlikka ega bo'ladi.

Va bu hali hammasi emas. Ba'zi "harflar" bir nechta kod nuqtasidan iborat:

MatnKod nuqtalariOdam ko'rgan harf
é (tayyor belgi)11
é (e + urg'u)21
Bayroq emojisi21
Oila emojisi7 gacha1

Shuning uchun "matn uzunligi" degan savolga javob berishdan oldin qaysi uzunlik kerakligini aniqlang: bayt, kod nuqtasi yoki ko'rinadigan belgi.

Foydalanuvchi kiritgan matn uzunligini cheklayotgan bo'lsangiz, odatda uchinchisi to'g'ri javob.

Amaliy topshiriq
  1. A va a ning kodlarini ikkilikda yozib, farqni toping.
  2. M harfini kichik harfga o'girish uchun qaysi bitni almashtirish kerak?
  3. '9' belgisidan 9 sonini qanday olish mumkin?
  4. O'z ismingizdagi har harfning ASCII kodini yozing.
  5. Oʻzbekiston so'zi nima uchun 12 bayt egallashini tushuntiring.
  6. U+0439 belgisi necha bayt oladi? Birinchi baytiga qarab ayting.
  7. 11110xxx bilan boshlangan bayt nechta bayt kelishini bildiradi?
  8. "Krakozyabra" nima uchun paydo bo'lishini uch qatorda yozing.
  9. Baytlarni e'tiborsiz qoldirish nima uchun xavfli ekanini ayting.
  10. Sevimli saytingiz HTML kodida charset ko'rsatilganini tekshiring.

Xulosa #

  • Xotirada faqat sonlar bor - harf va son o'rtasidagi bog'liqlik kelishuv.
  • ASCII (1963) - 7 bit, 128 belgi; jadvali apparatni soddalashtirish uchun tuzilgan.
  • a va A farqi aynan 32, ya'ni bitta bit - registr almashtirish bir XOR.
  • 128 belgi yetmagach, har mamlakat o'z jadvalini yasadi - tartibsizlik boshlandi.
  • Unicode har belgiga yagona raqam beradi, UTF-8 uni baytlarga yozadi.
  • UTF-8 da belgi 1 dan 4 baytgacha; birinchi bayt uzunlikni aytadi.
  • UTF-8 ASCII bilan to'liq mos va o'z-o'zini sinxronlaydi.
  • Baytlarning o'zida kodlash haqida ma'lumot yo'q - u tashqaridan beriladi.
  • Faylni ochayotganda kodlashni har doim aniq ko'rsating.
  • "Uzunlik" uch xil bo'ladi: bayt, kod nuqtasi va ko'rinadigan belgi.

Keyingi bo'limda xotiraga qaytamiz: manzillar, baytlar tartibi va tuzilmalar.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.