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.
Ushbu bo‘lim mundarijasi
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:
| Kod | Nima joylashgan |
|---|---|
| 32-47 | bo'sh joy va tinish belgilari |
| 48-57 | raqamlar 0 dan 9 gacha |
| 65-90 | katta harflar A dan Z gacha |
| 97-122 | kichik harflar a dan z gacha |
Bu tartibdan ikkita foydali qonuniyat kelib chiqadi.
1. Katta va kichik harf orasidagi farq - aynan 32.
| Belgi | Kodi | Ikkilikda |
|---|---|---|
A | 65 | 01000001 |
a | 97 | 01100001 |
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.
ASCII 1963-yilda ishlab chiqilgan va uning jadvali sinchkovlik bilan tuzilgan:
| Qonuniyat | Foydasi |
|---|---|
a va A farqi aynan 32 (bitta bit) | Registr almashtirish - bitta XOR |
| Raqamlar ketma-ket, 48 dan | Belgini songa aylantirish - ayirish |
| Harflar alifbo tartibida | Saralash - oddiy taqqoslash |
| Boshqaruv belgilari 0-31 da | Ularni 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 #
Turli belgilar turli hajm egallaydi:
| Belgi | Kod nuqtasi | Baytlar | Nechta bayt |
|---|---|---|---|
A | U+0041 | 41 | 1 |
z | U+007A | 7a | 1 |
ʻ | U+02BB | ca bb | 2 |
й | U+0439 | d0 b9 | 2 |
Ω | U+03A9 | ce a9 | 2 |
文 | U+6587 | e6 96 87 | 3 |
🌍 | U+1F30D | f0 9f 8c 8d | 4 |
Qanday qilib nechta bayt kelishini bilamiz? Birinchi baytning o'zi aytadi:
| Birinchi bayt boshlanishi | Nechta bayt |
|---|---|
0xxxxxxx | 1 (ASCII bilan bir xil) |
110xxxxx | 2 |
1110xxxx | 3 |
11110xxx | 4 |
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.
| Matn | Belgilar | Baytlar |
|---|---|---|
Salom, dunyo! | 13 | 13 |
Oʻzbekiston | 11 | 12 |
Ikkinchi qatorda ʻ belgisi ikki bayt egallagani uchun farq
paydo bo'ldi.
UTF-8 ni 1992-yilda Ken Tompson va Rob Payk o'ylab topishgan - rivoyatga ko'ra, restoran salfetkasida.
| Xossa | Nima uchun muhim |
|---|---|
| ASCII bilan mos | Eski matnlar o'zgarishsiz ishlaydi |
| O'z-o'zini sinxronlaydi | Bayt oqimining o'rtasidan boshlab ham belgi chegarasini topish mumkin |
| Bayt tartibi muhim emas | Endianlik 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:
| Baytlar | Kodlash | Natija |
|---|---|---|
54 6f 73 68 6b 65 6e 74 | UTF-8 | Toshkent |
| o'sha baytlar | latin-1 | Toshkent |
| o'sha baytlar | cp1251 | Toshkent |
Lekin kirilcha matnda vaziyat butunlay o'zgaradi:
| Nima | Qiymat |
|---|---|
| Asl matn | Тошкент |
| UTF-8 baytlari | d0 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:
| Yondashuv | Natija |
|---|---|
| Xato bilan to'xtatish | o'qish bekor qilinadi |
| Almashtirish | Salom �� dunyo |
| E'tiborsiz qoldirish | Salom dunyo |
Uchinchisi xavfli: ma'lumot jimgina yo'qoladi va hech kim sezmaydi.
Baytlarning o'zida "men UTF-8 man" degan ma'lumot yo'q. Kodlash har doim tashqaridan beriladi:
| Qayerda | Qanday |
|---|---|
| HTTP | Content-Type: text/html; charset=utf-8 |
| HTML | <meta charset="utf-8"> |
| Ma'lumotlar bazasi | Jadval va ulanish kodlashi |
| Fayl | Kelishuv yoki BOM |
| Dastur | Faylni 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.
"🌍 ning uzunligi qancha?" degan savolga bitta to'g'ri
javob yo'q - u nimani sanashingizga bog'liq:
| Nimani sanaymiz | Javob |
|---|---|
| Kod nuqtalari | 1 |
| UTF-16 birliklari | 2 |
| Baytlar | 4 |
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:
| Matn | Kod nuqtalari | Odam ko'rgan harf |
|---|---|---|
é (tayyor belgi) | 1 | 1 |
é (e + urg'u) | 2 | 1 |
| Bayroq emojisi | 2 | 1 |
| Oila emojisi | 7 gacha | 1 |
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.
Avaaning kodlarini ikkilikda yozib, farqni toping.Mharfini kichik harfga o'girish uchun qaysi bitni almashtirish kerak?'9'belgisidan 9 sonini qanday olish mumkin?- O'z ismingizdagi har harfning ASCII kodini yozing.
Oʻzbekistonso'zi nima uchun 12 bayt egallashini tushuntiring.U+0439belgisi necha bayt oladi? Birinchi baytiga qarab ayting.11110xxxbilan boshlangan bayt nechta bayt kelishini bildiradi?- "Krakozyabra" nima uchun paydo bo'lishini uch qatorda yozing.
- Baytlarni e'tiborsiz qoldirish nima uchun xavfli ekanini ayting.
- Sevimli saytingiz HTML kodida
charsetko'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.
avaAfarqi 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.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.