UTF-8: Boshidan-oxirigacha! 1-qism!
PHP ni endi o’rganishni boshlaganimda, «Салом» so’zini bazadan o’qib brovzerda chiqaraman desam «РЎР°Р»РѕРј» shunga o’xshash narsalar chiqib qolgan. Endi o’rganishni boshlagan dasturchi uchun bu juda g’alati narsalar bo’lib tuyulgan. Bu xatoni to’g’rilash uchun:
1. Ma’lumotlar bazasida barcha ustun va jadvallarni utf8_general_ci ga qo’yish
2. MySQL ulanganda: mysql_query(‘SET NAMES UTF8’);
3. PHP fayllarni hammasini UTF-8 da saqlash
4. HTML sahifaga
5. PHP da header(«Content-type: text/html; charset: utf-8»);
ko’rinishidagi sozlashlarni qilish zarurati tug’ilgan. Hozirgi kunda yangi o’rganayotgan web dasturchilar bunaqa sozlashlarni qilmasa kerak, chunki ko’pchilik framework ishlatishi sababli, frameworklarning o’zlari yuqoridagi sozlashlarni siz uchun «default» holatda qilishadi. Ya’ni siz hech qanday sozlashlar qilmasangiz, hammasi yuqoridagiday sozlangan bo’ladi.
E’tibor berayotgan bo’lsangiz, UTF-8 shunchalik hayotimizga kirib keldiki, hozirgi web saytlarni usiz tasavvur qilish juda qiyin, ayniqsa O’zbekistonda! Chunki O’zbekistonda bir vaqtda lotincha va krillcha harflarni qo’llaydigan sayt qilish kerakda? 🙂
Keling endi UTF-8 o’zi nima? degan savol javob berishga harakat qilib ko’rsak.
Agar qisqacha javob bersam, bu bir nechta kodlash jadvallaridan biridir. Tushunmadingizmi, o’qishda davom eting.
Manimcha ko’pchilik maktab darsliklarida ASCII degan narsani eshitgan. Aslida bu ham kodlash jadvalidir. Faqat buning kamchligi, atigi 128 ta belgini qo’llab-quvvatlaydi. Qolgan 0x80-0xFF oraliqlari kengaytirilgan bo’lib, tanlangan kodlash jadvalidan kelib chiqib o’zgarishi mumkin. Misol uchun windows-1250 va windows-1251 jadvallariga qarasangiz kodlar bir-xil, lekin belgilar farqlanadi.
Yuqoridagilardan tashqari, har bitta korxona o’zining maxsulotlari uchun kodlash jadvallar yaratishni boshlagan. Misol uchun, MacCyrillic Macintosh kompyuterlari uchun.
Agar e’tibor bergan bo’lsangiz, yuqorida keltirgan 3 ta kodlash jadvallari 0x00 dan 0xFF gacha bo’lib, 8 bitli kodlash jadvallari guruhiga mansubdir. Bunaqa turdagi kodlash jadvallarining qo’llashdagi qiyinchiligini quyidagi misol bilan tushuntirsam.
Windows-1251 da krillcha «Щ» belgisi 0xD9 kodida turibdi, MacCyrillic da esa 0x99 da! Tasavvur qiling, windows-1251 da ishlaydigan dastur «Щ» harfini tarmoqda jo’natsa 0xD9 kodini (bayt) yuboradi. Macintoshda ishlayotgan foydalanuvchiga esa «ў» belgisi (0xD9) chiqqan bo’lardi. Chunki undagi kodlash jadvali MacCyrillic!
Shunaqa har xil muammolar kelib chiqqandan keyin, UNICODE standarti dunyo yuzini ko’rdi. UNICODE standart bo’lib, yuqoridagilardan farqi 1 mln. dan ortiq belgilarni saqlash mumkin.
UNICODE bu standard, shu UNICODE asosida ishlaydigan kodlash jadvallari esa UTF-8, UTF-16, va UTF-32 (yana bor … 🙂 ).
UTF-16 va UTF-32 bular mos ravishda o’zgarmas (O’ZGARMAS) 16 (2 bayt) va 32 (4 bayt) bitli uzunlikdagi belgilar to’plamidir. UTF-8 da sal boshqacharoq.
Misol uchun, UTF-8 da logincha «A» harfi 1 bayt (0x41), krillcha «Щ» harfi 2 bayt (0xd0a9), yaponcha «ぁ» (kichik A) belgisi 3 bayt (0xe38181) va «𐄳» belgisi 4 bayt (0xf09084b3). (to’liq jadval). Ya’ni UTF-8 da kodlangan belgilar 1 baytdan 4 baytgacha bo’lishi mumkin. Bu nima uchun kerak?
Biz bilamizki internet olamida deyarli barcha dasturlar, web sahifalar (HTML/CSS,JS) lotin harfida yoziladi. Agar biz «default» UTF-16 ni ishlatganimizda, telegramdan yozgan har bir lotincha harfimizga ortiqcha 1 bayt trafik ishlatardik. Shu tariqa har bir ochgan web sahifamizga ham 2 barobar ko’proq trafik sarflagan bo’lardik. UTF-8 ning shu darajada mashxur bo’lishiga asosiy sabab dastlabki 128 ta belgi ASCII jadvali bilan bir-xil bo’lib, ikkalasida ham 1 bayt joy egallaydi. Ushbu 128 ta belgi, lotin harflarini va dasturlashda ko’p ishlatiladigan belgilarni o’z ichiga oladi.
O’ylashimcha dastlabki ma’lumotlar yetarlicha. Qolgani ikkinchi qismda.
Umumiy Dasturlash
UTF-8: Boshidan-oxirigacha! 1-qism!