Qo'shimcha mavzular

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:

Oddiy belgilar uchun bu bir xil:

unicode-oddiy.js
// natija shu yerda chiqadi

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:

unicode-surrogat.js
// natija shu yerda chiqadi
Emoji yoki maxsus belgilar bilan ishlaganda 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:

unicode-codepoint.js
// natija shu yerda chiqadi
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:

unicode-escape.js
// natija shu yerda chiqadi

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:

unicode-sanash.js
// natija shu yerda chiqadi
Bu ham hamma holatni yechmaydi: bayroq emojilari yoki teri rangi modifikatori qo'shilgan emojilar bir nechta kod nuqtasidan iborat bo'lib, for..of ularni bo'lib yuboradi. To'liq aniq sanash uchun Intl.Segmenter ishlatiladi.
Foydalanuvchi kiritgan matn uzunligini cheklaganizda str.lengthga ko'r-ko'rona ishonmang โ€” emojili matnlarda u ko'rinadigan belgilardan katta bo'ladi.

Xulosa