Unicode — dunyodagi yozuv tizimlari, belgilar, emoji va texnik symbolarni yagona raqamli kod maydonida ifodalash standarti.
Unicode har belgiga code point beradi. Encoding esa shu code pointlarni baytlarga aylantiradi.
Masalan, A belgisi:
U+0041
code pointiga ega.
Unicode va UTF-8 bir xil tushuncha emas: Unicode belgilar modelini, UTF-8 esa bayt encoding usulini belgilaydi.
Code point
Unicode code point odatda:
U+XXXX
ko‘rinishida yoziladi.
Misollar:
A → U+0041
O‘ → bir yoki bir nechta code point ko‘rinishi mumkin
€ → U+20AC
😀 → U+1F600
Code point qiymati glyph yoki ekranda chiziladigan shaklning o‘zi emas.
Unicode diapazoni
Unicode code space:
U+0000 dan U+10FFFF gacha
bo‘linadi.
Barcha qiymatlar assign qilingan belgi emas. Ayrimlari:
- reserved;
- private use;
- surrogate;
- noncharacter;
- hali biriktirilmagan.
Plane
Code space 17 ta plane’ga bo‘linadi.
Basic Multilingual Plane
U+0000–U+FFFF.
Ko‘p keng tarqalgan yozuv, punctuation va symbol shu plane’da.
Supplementary planes
Emoji, tarixiy yozuvlar, musiqa symboli va boshqa belgilar yuqori plane’larda joylashadi.
Character va glyph
Character abstrakt belgi.
Glyph font tomonidan chizilgan vizual shakl.
Bitta character turli fontda boshqa ko‘rinadi.
Bir glyph bir nechta character kombinatsiyasini ifodalashi, bir character esa kontekstga qarab boshqa glyph olishi mumkin.
Arab yozuvida harfning bosh, o‘rta va oxirgi shakli context orqali tanlanadi.
Code point va grapheme cluster
Foydalanuvchi bitta belgi deb ko‘radigan narsa bir nechta code pointdan iborat bo‘lishi mumkin.
Masalan:
- asosiy harf va combining accent;
- emoji va skin tone modifier;
- zero-width joiner bilan family emoji;
- flag uchun regional indicatorlar.
UI cursor va backspace code point emas, grapheme cluster bo‘yicha ishlashi kerak.
Combining character
Accent alohida code point sifatida asosiy belgidan keyin kelishi mumkin.
Masalan, é ikki ko‘rinishda ifodalanadi:
- bitta precomposed code point;
eva combining acute accent.
Ko‘rinishi bir xil bo‘lsa ham baytlar va code pointlar boshqa.
Normalization
Unicode ekvivalent ketma-ketliklarni standard shaklga keltiradi.
Asosiy formalar:
- NFC — canonical composition;
- NFD — canonical decomposition;
- NFKC — compatibility composition;
- NFKD — compatibility decomposition.
String comparison va searchdan oldin kerakli normalization tanlanadi.
Compatibility normalization ayrim vizual yoki semantik farqlarni yo‘qotishi mumkin.
Encoding
Unicode code pointlar baytlarga encoding qilinadi.
Keng tarqalganlari:
- UTF-8;
- UTF-16;
- UTF-32.
Bitta text turli encodingda boshqa baytlar ketma-ketligiga ega.
Encoding noto‘g‘ri talqin qilinsa mojibake yuz beradi.
UTF-8
UTF-8 code pointni 1 dan 4 baytgacha kodlaydi.
ASCII belgilar bir bayt va ayni qiymatda saqlanadi.
Bu web, Unix va ko‘p zamonaviy tizimlarda keng tarqalgan.
UTF-16
UTF-16 Basic Multilingual Plane belgilarini odatda bitta 16-bit code unitda saqlaydi.
Yuqori plane belgilar surrogate pair — ikki code unit bilan ifodalanadi.
Shu sababli “string length” code unit sonini qaytarsa emoji ikki birlik bo‘lishi mumkin.
UTF-32
Har code point 32-bit code unitda saqlanadi.
Indexlash sodda, ammo xotira sarfi katta.
Grapheme cluster baribir bir nechta code pointdan iborat bo‘lishi mumkin.
BOM
Byte Order Mark encoding va byte orderni ko‘rsatishi mumkin.
UTF-8 BOM majburiy emas va ayrim parserlarda keraksiz belgi sifatida muammo tug‘diradi.
UTF-16 va UTF-32da BOM endiannessni aniqlashga yordam beradi.
Unicode property
Har code point metadata’ga ega:
- general category;
- script;
- case;
- combining class;
- whitespace;
- bidirectional class;
- numeric value.
Regex va text engine \p{Letter} kabi property orqali qidirishi mumkin.
Case conversion
Uppercase va lowercase har doim bir belgidan bir belgiga oddiy mapping emas.
Ba’zi tilda:
- bir belgi bir nechta belgiga o‘tadi;
- locale natijaga ta’sir qiladi;
- case folding alohida qoidaga ega.
Case-insensitive comparison uchun oddiy lower() yetarli bo‘lmasligi mumkin.
Bidirectional text
Arab va ibroniy yozuvi o‘ngdan chapga, raqam va lotin bo‘laklari chapdan o‘ngga bo‘lishi mumkin.
Unicode Bidirectional Algorithm aralash matnni ekranga joylashtiradi.
Bidi control characterlar source code va file nomida ko‘rinish bilan real tartibni farqlashi mumkin.
Confusable belgi
Turli scriptdagi belgilar tashqi ko‘rinishda o‘xshash bo‘lishi mumkin.
Masalan, lotin a va kirill а.
Bu:
- domain spoofing;
- identifier;
- login;
- code review
xavfini tug‘diradi.
Security-sensitive nomlar normalization va script policy bilan tekshiriladi.
Zero-width belgilar
Ayrim Unicode belgilar ekranda kenglik egallamaydi.
Misollar:
- zero-width joiner;
- zero-width non-joiner;
- word joiner;
- bidirectional control.
Ular matn shakli va emoji kombinatsiyasini boshqaradi, lekin yashirin farq yaratishi ham mumkin.
Collation
Stringlarni alifbo tartibida saralash code point tartibi bilan bir xil emas.
Locale-aware collation:
- harf tartibi;
- accent;
- case;
- numeric segment;
- punctuation
qoidalarini hisobga oladi.
Database collation search va unique constraint natijasiga ta’sir qiladi.
Unicode versiyasi
Unicode yangi belgilar va propertylarni versiyalar bilan qo‘shadi.
OS, font, runtime va database turli Unicode versiyasini qo‘llashi mumkin.
Yangi emoji code point sifatida mavjud bo‘lsa ham eski fontda kvadrat shakl ko‘rinishi mumkin.
Diagnostika
Unicode muammosida:
- code point;
- encoding;
- raw bayt;
- normalization;
- grapheme;
- font;
- locale;
- bidi control;
- Unicode versiyasi;
- database collation
tekshiriladi.
Ko‘rinishi bir xil matn binary jihatdan boshqa bo‘lishi mumkin.
Bog‘liq tushunchalar
Code point, Glyph, Grapheme cluster, UTF-8, UTF-16, UTF-32, Normalization, Encoding, Unicode property, Collation