Skip to content

Commit 7b35a4c

Browse files
authored
Apply suggestions from code review
1 parent 9118849 commit 7b35a4c

File tree

1 file changed

+25
-24
lines changed

1 file changed

+25
-24
lines changed

1-js/99-js-misc/06-unicode/article.md

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,34 @@
1+
12
# Юнікод, внутрішня будова рядків
23

34
```warn header="Передові знання"
4-
В цьому розділі зануримося у внутрішню будову рядків. Ці знання знадобляться вам, якщо ви плануєте мати справу з емодзі, рідкісними математичними чи ієрогліфічними символами чи іншими рідкісними символами.
5+
В цьому розділі ми зануримося у внутрішню будову рядків. Ці знання знадобляться вам, якщо ви плануєте мати справу з емодзі, рідкісними математичними чи ієрогліфічними символами та іншими винятковими символами.
56
```
67

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 байтів.
89

9-
JavaScript дозволяє нам вставляти символ в рядок, вказуючи його шістнадцятковий код Юнікод за допомогою однієї із цих нотацій:
10+
JavaScript дозволяє нам вставляти символ в рядок, вказуючи його шістнадцятковий код Юнікод за допомогою однієї з трьох нотацій нижче:
1011

1112
- `\xXX`
1213

13-
де `XX` повинно бути двома шістнадцятковими цифрами зі значенням між `00` та `FF`, як наслідок, `\xXX` - це символ, код якого в Юнікоді відповідає`XX`.
14+
де `XX` повинно бути двома шістнадцятковими цифрами зі значенням між `00` та `FF`, як наслідок, `\xXX` -- це символ, код якого в Юнікоді відповідає`XX`.
1415

1516
Оскільки `\xXX` нотація підтримує тільки дві шістнадцяткові цифри, її можна використовувати лише для перших 256 символів Юнікоду.
1617

17-
Ці перші 256 символів включають у себе латинський алфавіт, більшість синтаксичних символів і деякі інші. Для прикладу, `"\x7A"` - це те ж саме, що `"z"` (Юнікод `U+007A`).
18+
Ці перші 256 символів включають у себе латинський алфавіт, більшість синтаксичних символів і деякі інші. Для прикладу, `"\x7A"` -- це те ж саме, що й `"z"` (Юнікод `U+007A`).
1819

1920
```js run
2021
alert( "\x7A" ); // z
2122
alert( "\xA9" ); // ©, символ авторського права
2223
```
2324

2425
- `\uXXXX`
25-
де `XXXX` повинно складатися з рівно 4 шістнадцяткових цифр із значеннями між `0000` та `FFFF`, як наслідок, `\uXXXX` - це символ, код якого в Юнікоді відповідає `XXXX`.
26+
де `XXXX` повинно складатися з рівно 4-ох шістнадцяткових цифр із значеннями між `0000` та `FFFF`, як наслідок, `\uXXXX` - це символ, код якого в Юнікоді відповідає `XXXX`.
2627
27-
Символи зі значеннями Юнікоду, більшими за `U+FFFF`, також можуть бути представлені за допомогою цієї нотації, але в цьому випадку нам потрібно буде використовувати так звану сурогатну пару (про сурогатні пари ми поговоримо пізніше в цій главі).
28+
Символи з Юнікод значеннями , більшими за `U+FFFF`, також можуть бути представлені за допомогою цієї нотації, але в цьому випадку нам потрібно буде використовувати так звану сурогатну пару (про сурогатні пари ми поговоримо пізніше в цій главі).
2829
2930
```js run
30-
alert( "\u00A9" ); // ©, те ж саме, що \xA9, тільки з використанням 4-х шістнадцяткової нотації
31+
alert( "\u00A9" ); // ©, те ж саме, що й \xA9, тільки з використанням 4-ох символьної шістнадцяткової нотації
3132
alert( "\u044F" ); // я, буква кирилиці
3233
alert( "\u2191" ); // ↑, символ стрілки вгору
3334
```
@@ -43,11 +44,11 @@ JavaScript дозволяє нам вставляти символ в рядок
4344

4445
## Сурогатні пари
4546

46-
Усі часто використовувані символи мають 2-байтові коди (4 шістнадцяткові цифри). Букви в більшості європейських мов, цифри та основні уніфіковані ідеографічні набори CJK (CJK китайська, японська та корейська системи письма) мають 2-байтове представлення.
47+
Усі найпошириніші символи мають 2-байтові коди (4 шістнадцяткові цифри). Букви в більшості європейських мов, цифри та основні уніфіковані ідеографічні набори CJK (CJK -- китайська, японська та корейська системи письма) мають 2-байтове представлення.
4748

48-
Спочатку JavaScript базувався на кодуванні UTF-16, яке допускало лише 2 байти на символ. Але 2 байти дозволяють лише 65536 комбінацій, а цього недостатньо для кожного можливого символу Юнікоду.
49+
Спочатку JavaScript базувався на кодуванні UTF-16, яке допускало лише 2 байти на символ. Але 2 байти забезпечують лише 65536 комбінацій, а цього недостатньо для кожного можливого символу Юнікоду.
4950

50-
Тож рідкісні символи, які потребують більше 2 байтів, кодуються парою 2-байтових символів, які називаються «сурогатною парою».
51+
Тож рідкісні символи, які потребують більше 2-ох байтів, кодуються парою 2-байтових символів, які називаються "сурогатною парою".
5152

5253
Побічним ефектом є те, що довжина таких символів рівна `2`:
5354

@@ -57,7 +58,7 @@ alert( '😂'.length ); // 2, обличчя зі сльозами радост
5758
alert( '𩷶'.length ); // 2, рідкісний китайський ієрогліф
5859
```
5960

60-
Так виходить через те, що сурогатних пар не існувало в той час, коли був створений JavaScript, і тому вони не оброблюються мовою належним чином!
61+
Це працює таким чином, бо сурогатних пар не існувало в той час, коли був створений JavaScript, і тому вони не обробляються мовою належним чином!
6162

6263
Фактично ми маємо один символ у кожному з наведених вище рядків, але властивість `length` показує довжину `2`.
6364

@@ -70,13 +71,13 @@ alert( '𝒳'[0] ); // показує дивні символи...
7071
alert( '𝒳'[1] ); // ...частини сурогатної пари
7172
```
7273

73-
Частини сурогатної пари не мають значення одна без одної. Отже, сповіщення у наведеному вище прикладі насправді відображають сміття.
74+
Частини сурогатної пари не мають значення одна без одної. Отже, сповіщення у наведеному вище прикладі фактично відображають тарабарщину.
7475

7576
Технічно сурогатні пари також можна визначити за їхніми кодами: якщо символ має код в інтервалі `0xd800..0xdbff`, то це перша частина сурогатної пари. Наступний символ (друга частина) повинен мати код в інтервалі `0xdc00..0xdfff`. Ці інтервали зарезервовані стандартом виключно для сурогатних пар.
7677

7778
Тому для роботи з сурогатними парами в 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).
7879

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), але з сурогатними парами поводяться коректно.
8081

8182
Тут можна побачити різницю:
8283

@@ -89,7 +90,7 @@ alert( '𝒳'.charCodeAt(0).toString(16) ); // d835
8990
alert( '𝒳'.codePointAt(0).toString(16) ); // 1d4b3, зчитує обидві частини сурогатної пари
9091
```
9192

92-
Тим не менш, якщо ми беремо з позиції 1 (це тільки для прикладу, так робити неправильно), то вони обидва повертають лише 2-гу частину пари:
93+
Тим не менш, якщо ми намагаємось отримати результат з позиції 1 (це тільки для прикладу, так робити неправильно), то вони обидва повертають лише 2-гу частину пари:
9394

9495
```js run
9596
alert( '𝒳'.charCodeAt(1).toString(16) ); // dcb3
@@ -106,9 +107,9 @@ alert( '𝒳'.codePointAt(1).toString(16) ); // dcb3
106107
alert( 'Привіт 😂'.slice(0, 8) ); // Привіт [?]
107108
```
108109

109-
Тут ми можемо побачити сміттєвий символ (першу половину сурогатної пари посмішки) у виведених даних.
110+
Тут ми можемо побачити незрозумілий символ (першу половину сурогатної пари посмішки) у виведених даних.
110111

111-
Просто пам’ятайте про це, якщо ви маєте намір надійно працювати із сурогатними парами. Можливо, це не велика проблема, але принаймні ви повинні розуміти, що відбувається.
112+
Просто пам’ятайте про це, якщо ви хочете надійно працювати із сурогатними парами. Можливо, це не велика проблема, але принаймні ви повинні розуміти, що відбувається.
112113
````
113114

114115
## Діакритичні знаки та нормалізація
@@ -117,19 +118,19 @@ alert( 'Привіт 😂'.slice(0, 8) ); // Привіт [?]
117118

118119
Наприклад, літера `a` може бути базовим символом для таких символів: `àáâäãåā`.
119120

120-
Більшість поширених «складених» символів мають власний код у таблиці Юнікод. Але не всі, тому що можливих комбінацій занадто багато.
121+
Більшість поширених "складених" символів мають власний код у таблиці Юнікод. Але не всі, тому що можливих комбінацій занадто багато.
121122

122-
Щоб підтримувати довільні композиції, стандарт Юнікод дозволяє нам використовувати кілька символів Юнікод: базовий символ, за яким іде один або багато символів-позначок, які «прикрашають» його.
123+
Щоб підтримувати довільні композиції, стандарт Юнікод дозволяє нам використовувати кілька символів Юнікод: базовий символ, за яким іде один або декілька символів-позначок, які "прикрашають" його.
123124

124-
Наприклад, якщо ми маємо символ `S`, за яким іде спеціальний символ «крапка зверху» (код `\u0307`), в такому разі буде відображатися як Ṡ.
125+
Наприклад, якщо ми маємо символ `S`, за яким іде спеціальний символ "крапка зверху" (код `\u0307`), в підсумку ми отримаємо Ṡ.
125126

126127
```js run
127128
alert( 'S\u0307' ); // Ṡ
128129
```
129130

130131
Якщо нам потрібна додаткова позначка над літерою (або під нею) -- не проблема, просто додайте необхідний символ позначки.
131132

132-
Наприклад, якщо ми додамо символ «крапка знизу» (код `\u0323`), то ми матимемо «S з крапками зверху та знизу»: `Ṩ`.
133+
Наприклад, якщо ми додамо символ "крапка знизу" (код `\u0323`), то ми матимемо "S з крапками зверху та знизу": `Ṩ`.
133134

134135
Наприклад:
135136

@@ -150,7 +151,7 @@ alert( `s1: ${s1}, s2: ${s2}` );
150151
alert( s1 == s2 ); // false, хоча символи виглядають однаково (?!)
151152
```
152153

153-
Щоб вирішити цю проблему, існує алгоритм «нормалізації Юнікоду», який приводить кожен рядок до єдиної «нормальної» форми.
154+
Щоб вирішити цю проблему, існує алгоритм "нормалізації Юнікоду", який приводить кожен рядок до єдиної "нормальної" форми.
154155

155156
Це реалізовується за допомогою [str.normalize()](mdn:js/String/normalize).
156157

@@ -166,6 +167,6 @@ alert( "S\u0307\u0323".normalize().length ); // 1
166167
alert( "S\u0307\u0323".normalize() == "\u1e68" ); // true
167168
```
168169

169-
Насправді, це не завжди так. Причина в тому, що символ `` є «достатньо поширеним», тому творці Юнікоду включили його в основну таблицю та дали йому код.
170+
Насправді, це не завжди так. Причина в тому, що символ `` є "достатньо поширеним", тому творці Юнікоду включили його в основну таблицю та дали йому окремий код.
170171

171-
Якщо ви хочете дізнатися більше про правила та варіанти нормалізації -- вони описані в додатку до стандарту Юнікод: [Unicode Normalization Forms](https://www.unicode.org/reports/tr15/), але для більшості практичних цілей інформації з цього розділу достатньо.
172+
Якщо ви хочете дізнатися більше про правила та варіанти нормалізації -- вони описані в додатку до стандарту Юнікод: [Unicode Normalization Forms](https://www.unicode.org/reports/tr15/), але для більшості практичних задач інформації з цього розділу достатньо.

0 commit comments

Comments
 (0)