Bosh sahifa Wiki Unicode

Unicode

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+0000U+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;
  • e va 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:

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:

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:

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