Unicode, satr ichki tuzilishi
JavaScript satrlari UTF-16 kodlashiga asoslanadi. Ko'p belgilar bitta "kod birligi"ga sig'adi, lekin ba'zilari (emoji, kam uchraydigan iyerogliflar) ikkitaga bo'linadi โ bu esa satr uzunligi bilan bog'liq chalkashliklar keltirib chiqaradi.
Kod birligi va kod nuqtasi
Ikki muhim tushuncha:
- Kod birligi (code unit) โ UTF-16 dagi 16-bitli qism.
str.lengthaynan shu birliklarni sanaydi; - Kod nuqtasi (code point) โ belgiga to'liq mos keluvchi Unicode raqami. Ba'zi belgilar bitta kod nuqtasi, lekin ikkita kod birligidan iborat.
Oddiy belgilar uchun bu bir xil:
Surrogat juftlar
Kod nuqtasi U+FFFF dan katta bo'lgan belgilar (emoji, ba'zi harflar) ikkita kod birligi โ surrogat juft bilan ifodalanadi. Shu sabab bitta emoji length bo'yicha "2" deb sanaladi:
str.length ko'rinadigan belgilar sonini bermaydi. U kod birliklarini sanaydi, emoji esa 2 (ba'zan undan ko'p) birlik oladi.codePointAt va charCodeAt
charCodeAt(i) berilgan pozitsiyadagi kod birligini (0..65535) qaytaradi. codePointAt(i) esa surrogat juftni to'g'ri o'qib, to'liq kod nuqtasini qaytaradi:
codePointAt va String.fromCodePoint โ surrogat juftlarni to'g'ri qayta ishlaydigan zamonaviy juftlik. Eski charCodeAt/fromCharCode faqat bitta kod birligi bilan ishlaydi.\u escape ketma-ketligi
Unicode belgini kodi orqali yozishning uch usuli bor:
\xXXโ ikki o'n oltilik raqam (0..255);\uXXXXโ to'rt o'n oltilik raqam (bitta UTF-16 birligi);\u{X...}โ jingalak qavsda istalgan kod nuqtasi (5-6 raqamli belgilar uchun).
Emoji uzunligini to'g'ri sanash
Ko'rinadigan belgilarni to'g'ri sanash uchun satrni for..of yoki spread ([...str]) bilan aylantiring โ ular kod nuqtalari bo'yicha yuradi, surrogat juftni butun deb oladi:
for..of ularni bo'lib yuboradi. To'liq aniq sanash uchun Intl.Segmenter ishlatiladi.str.lengthga ko'r-ko'rona ishonmang โ emojili matnlarda u ko'rinadigan belgilardan katta bo'ladi.Xulosa
- JavaScript satrlari UTF-16 da saqlanadi;
str.lengthkod birliklarini sanaydi; - Kod nuqtasi
U+FFFFdan katta belgilar surrogat juft (2 birlik) bilan yoziladi; codePointAtvaString.fromCodePointsurrogat juftlarni to'g'ri qayta ishlaydi;\xXX,\uXXXX,\u{X...}โ belgini kodi orqali yozish usullari;- Ko'rinadigan belgilarni sanash uchun
[...str]yokifor..of(murakkab hollardaIntl.Segmenter).