You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/99-js-misc/06-unicode/article.md
+25-24Lines changed: 25 additions & 24 deletions
Original file line number
Diff line number
Diff line change
@@ -1,33 +1,34 @@
1
+
1
2
# Юнікод, внутрішня будова рядків
2
3
3
4
```warn header="Передові знання"
4
-
В цьому розділі зануримося у внутрішню будову рядків. Ці знання знадобляться вам, якщо ви плануєте мати справу з емодзі, рідкісними математичними чи ієрогліфічними символами чи іншими рідкісними символами.
5
+
В цьому розділі ми зануримося у внутрішню будову рядків. Ці знання знадобляться вам, якщо ви плануєте мати справу з емодзі, рідкісними математичними чи ієрогліфічними символами та іншими винятковими символами.
5
6
```
6
7
7
-
Як вже відомо, рядки в JavaScript базуються на [Юнікоді](https://uk.wikipedia.org/wiki/%D0%AE%D0%BD%D1%96%D0%BA%D0%BE%D0%B4): кожен символ представляє собою послідовність із 1-4 байтів.
8
+
Як вже відомо, рядки в JavaScript базуються на [Юнікоді](https://uk.wikipedia.org/wiki/Юнікод): кожен символ -- це послідовність з 1-4 байтів.
8
9
9
-
JavaScript дозволяє нам вставляти символ в рядок, вказуючи його шістнадцятковий код Юнікод за допомогою однієї із цих нотацій:
10
+
JavaScript дозволяє нам вставляти символ в рядок, вказуючи його шістнадцятковий код Юнікод за допомогою однієї з трьох нотацій нижче:
10
11
11
12
-`\xXX`
12
13
13
-
де `XX` повинно бути двома шістнадцятковими цифрами зі значенням між `00` та `FF`, як наслідок, `\xXX` - це символ, код якого в Юнікоді відповідає`XX`.
14
+
де `XX` повинно бути двома шістнадцятковими цифрами зі значенням між `00` та `FF`, як наслідок, `\xXX` -- це символ, код якого в Юнікоді відповідає`XX`.
14
15
15
16
Оскільки `\xXX` нотація підтримує тільки дві шістнадцяткові цифри, її можна використовувати лише для перших 256 символів Юнікоду.
16
17
17
-
Ці перші 256 символів включають у себе латинський алфавіт, більшість синтаксичних символів і деякі інші. Для прикладу, `"\x7A"` - це те ж саме, що `"z"` (Юнікод `U+007A`).
18
+
Ці перші 256 символів включають у себе латинський алфавіт, більшість синтаксичних символів і деякі інші. Для прикладу, `"\x7A"` -- це те ж саме, що й`"z"` (Юнікод `U+007A`).
де `XXXX` повинно складатися з рівно 4 шістнадцяткових цифр із значеннями між `0000` та `FFFF`, як наслідок, `\uXXXX` - це символ, код якого в Юнікоді відповідає `XXXX`.
26
+
де `XXXX` повинно складатися з рівно 4-ох шістнадцяткових цифр із значеннями між `0000` та `FFFF`, як наслідок, `\uXXXX` - це символ, код якого в Юнікоді відповідає `XXXX`.
26
27
27
-
Символи зі значеннями Юнікоду, більшими за `U+FFFF`, також можуть бути представлені за допомогою цієї нотації, але в цьому випадку нам потрібно буде використовувати так звану сурогатну пару (про сурогатні пари ми поговоримо пізніше в цій главі).
28
+
Символи з Юнікод значеннями , більшими за `U+FFFF`, також можуть бути представлені за допомогою цієї нотації, але в цьому випадку нам потрібно буде використовувати так звану сурогатну пару (про сурогатні пари ми поговоримо пізніше в цій главі).
@@ -43,11 +44,11 @@ JavaScript дозволяє нам вставляти символ в рядок
43
44
44
45
## Сурогатні пари
45
46
46
-
Усі часто використовувані символи мають 2-байтові коди (4 шістнадцяткові цифри). Букви в більшості європейських мов, цифри та основні уніфіковані ідеографічні набори CJK (CJK— китайська, японська та корейська системи письма) мають 2-байтове представлення.
47
+
Усі найпошириніші символи мають 2-байтові коди (4 шістнадцяткові цифри). Букви в більшості європейських мов, цифри та основні уніфіковані ідеографічні набори CJK (CJK-- китайська, японська та корейська системи письма) мають 2-байтове представлення.
47
48
48
-
Спочатку JavaScript базувався на кодуванні UTF-16, яке допускало лише 2 байти на символ. Але 2 байти дозволяють лише 65536 комбінацій, а цього недостатньо для кожного можливого символу Юнікоду.
49
+
Спочатку JavaScript базувався на кодуванні UTF-16, яке допускало лише 2 байти на символ. Але 2 байти забезпечують лише 65536 комбінацій, а цього недостатньо для кожного можливого символу Юнікоду.
49
50
50
-
Тож рідкісні символи, які потребують більше 2 байтів, кодуються парою 2-байтових символів, які називаються «сурогатною парою».
51
+
Тож рідкісні символи, які потребують більше 2-ох байтів, кодуються парою 2-байтових символів, які називаються "сурогатною парою".
51
52
52
53
Побічним ефектом є те, що довжина таких символів рівна `2`:
Частини сурогатної пари не мають значення одна без одної. Отже, сповіщення у наведеному вище прикладі насправді відображають сміття.
74
+
Частини сурогатної пари не мають значення одна без одної. Отже, сповіщення у наведеному вище прикладі фактично відображають тарабарщину.
74
75
75
76
Технічно сурогатні пари також можна визначити за їхніми кодами: якщо символ має код в інтервалі `0xd800..0xdbff`, то це перша частина сурогатної пари. Наступний символ (друга частина) повинен мати код в інтервалі `0xdc00..0xdfff`. Ці інтервали зарезервовані стандартом виключно для сурогатних пар.
76
77
77
78
Тому для роботи з сурогатними парами в JavaScript були добавлені методи [String.fromCodePoint](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint) та [str.codePointAt](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt).
78
79
79
-
По суті, вони такі ж, як [String.fromCharCode](mdn:js/String/fromCharCode) та [str.charCodeAt](mdn:js/String/charCodeAt), але з сурогатними парами поводяться коректно.
80
+
По суті, вони такі ж, як і [String.fromCharCode](mdn:js/String/fromCharCode) та [str.charCodeAt](mdn:js/String/charCodeAt), але з сурогатними парами поводяться коректно.
alert( '𝒳'.codePointAt(0).toString(16) ); // 1d4b3, зчитує обидві частини сурогатної пари
90
91
```
91
92
92
-
Тим не менш, якщо ми беремо з позиції 1 (це тільки для прикладу, так робити неправильно), то вони обидва повертають лише 2-гу частину пари:
93
+
Тим не менш, якщо ми намагаємось отримати результат з позиції 1 (це тільки для прикладу, так робити неправильно), то вони обидва повертають лише 2-гу частину пари:
Тут ми можемо побачити сміттєвий символ (першу половину сурогатної пари посмішки) у виведених даних.
110
+
Тут ми можемо побачити незрозумілий символ (першу половину сурогатної пари посмішки) у виведених даних.
110
111
111
-
Просто пам’ятайте про це, якщо ви маєте намір надійно працювати із сурогатними парами. Можливо, це не велика проблема, але принаймні ви повинні розуміти, що відбувається.
112
+
Просто пам’ятайте про це, якщо ви хочете надійно працювати із сурогатними парами. Можливо, це не велика проблема, але принаймні ви повинні розуміти, що відбувається.
Наприклад, літера `a` може бути базовим символом для таких символів:`àáâäãåā`.
119
120
120
-
Більшість поширених «складених» символів мають власний код у таблиці Юнікод. Але не всі, тому що можливих комбінацій занадто багато.
121
+
Більшість поширених "складених" символів мають власний код у таблиці Юнікод. Але не всі, тому що можливих комбінацій занадто багато.
121
122
122
-
Щоб підтримувати довільні композиції, стандарт Юнікод дозволяє нам використовувати кілька символів Юнікод: базовий символ, за яким іде один або багато символів-позначок, які «прикрашають» його.
123
+
Щоб підтримувати довільні композиції, стандарт Юнікод дозволяє нам використовувати кілька символів Юнікод: базовий символ, за яким іде один або декілька символів-позначок, які "прикрашають" його.
123
124
124
-
Наприклад, якщо ми маємо символ `S`, за яким іде спеціальний символ «крапка зверху» (код `\u0307`), в такому разі буде відображатися якṠ.
125
+
Наприклад, якщо ми маємо символ `S`, за яким іде спеціальний символ "крапка зверху" (код `\u0307`), в підсумку ми отримаємоṠ.
125
126
126
127
```js run
127
128
alert( 'S\u0307' ); // Ṡ
128
129
```
129
130
130
131
Якщо нам потрібна додаткова позначка над літерою (або під нею) -- не проблема, просто додайте необхідний символ позначки.
131
132
132
-
Наприклад, якщо ми додамо символ «крапка знизу» (код `\u0323`), то ми матимемо «S з крапками зверху та знизу»:`Ṩ`.
133
+
Наприклад, якщо ми додамо символ "крапка знизу" (код `\u0323`), то ми матимемо "S з крапками зверху та знизу":`Ṩ`.
Насправді, це не завжди так. Причина в тому, що символ `Ṩ` є «достатньо поширеним», тому творці Юнікоду включили його в основну таблицю та дали йому код.
170
+
Насправді, це не завжди так. Причина в тому, що символ `Ṩ` є "достатньо поширеним", тому творці Юнікоду включили його в основну таблицю та дали йому окремий код.
170
171
171
-
Якщо ви хочете дізнатися більше про правила та варіанти нормалізації -- вони описані в додатку до стандарту Юнікод: [Unicode Normalization Forms](https://www.unicode.org/reports/tr15/), але для більшості практичних цілей інформації з цього розділу достатньо.
172
+
Якщо ви хочете дізнатися більше про правила та варіанти нормалізації -- вони описані в додатку до стандарту Юнікод: [Unicode Normalization Forms](https://www.unicode.org/reports/tr15/), але для більшості практичних задач інформації з цього розділу достатньо.
0 commit comments