- Notifications
You must be signed in to change notification settings - Fork179
Unicode: flag "u" and class \p{...}#374
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Uh oh!
There was an error while loading.Please reload this page.
Changes fromall commits
File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,161 +1,161 @@ | ||
#Юнікод: прапорець "u"та клас \p{...} | ||
УJavaScriptдля рядків використовується кодування [Юнікод](https://uk.wikipedia.org/wiki/Юнікод). Більшість символів кодуються 2 байтами, що дозволяє представити максимум65536символів. | ||
Цей діапазон недостатньо великий для кодування всіх можливих символів, тому деякі рідкісні символи кодуються 4 байтами, наприклад`𝒳` (математичний X)або `😄` (смайл),деякі ієрогліфи тощо. | ||
Ось значення Юнікодів для деяких символів: | ||
|Символ |Юнікод |Кількість байтів у Юнікоді | | ||
|------------|---------|--------| | ||
| a | `0x0061` | 2 | | ||
| ≈ | `0x2248` | 2 | | ||
|𝒳| `0x1d4b3` | 4 | | ||
|𝒴| `0x1d4b4` | 4 | | ||
|😄| `0x1f604` | 4 | | ||
Таким чином, такі символи, як`a`і `≈`, займають 2байти, а коди для `𝒳`, `𝒴`і `😄`довші, в них -- 4 байти. | ||
Коли створювалась моваJavaScript, кодування Юнікод було простіше: 4-байтових символів не існувало. Тому досі деякі функції мови все ще обробляють їх неправильно. | ||
Наприклад, властивість`length`вважає, що тут два символи: | ||
```js run | ||
alert('😄'.length); // 2 | ||
alert('𝒳'.length); // 2 | ||
``` | ||
...Але ми бачимо, що лише один, правда ж? Річ у тому, що властивість`length`трактує 4байти, як два символи по 2 байти. Це не правильно, адже їх необхідно розглядати тільки разом (так звана "сурогатна пара",детальніше у розділі <info:string>). | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. Перенесіть, будь ласка, цей текст на наступний рядок. У перекладі має бути стільки ж рядків, як і в оригінальній статті. Це необхідно щоб у майбутньому синхронізувати зміни. | ||
За замовчуванням регулярні вирази також розглядають 4-байтові "довгі символи" як пару 2-байтових. Як і у випадку з рядками, це може призвести до дивних результатів. Ми побачимо це трохи пізніше, у розділі <info:regexp-character-sets-and-ranges>. | ||
На відміну від рядків, регулярні вирази мають прапорець `pattern:u`, який виправляє такі проблеми. З таким прапорцем регулярний вираз правильно обробляє 4-байтові символи. А також стає доступним пошук з використанням властивостей Юнікоду, який ми розглянемо далі. | ||
##Властивості Юнікоду \p{...} | ||
Кожен символ в кодуванні Юнікод має багато властивостей. Вони описують, до якої "категорії" належить символ та містять різну інформацію про нього. | ||
Наприклад, якщо символ містить властивість `Letter`, це означає, що він належить до алфавіту (будь-якої мови).А властивість`Number`означає, що це цифра: може бути арабська, китайська тощо. | ||
Ми можемо шукати символи за властивістю, записаною як `pattern:\p{…}`.Щоб використовувати `pattern:\p{…}`,регулярний вираз повинен мати прапорець `pattern:u`. | ||
Наприклад, `\p{Letter}`позначає літеру будь-якою мовою. Ми також можемо використовувати коротший запис `\p{L}`,оскільки `L`є псевдонімом`Letter`.Майже для кожної властивості існують варіанти коротшого запису. | ||
У наведеному нижче прикладі буде знайдено три види літер: англійська, грузинська та корейська. | ||
```js run | ||
let str = "A ბ ㄱ"; | ||
alert( str.match(/\p{L}/gu) ); // A,ბ,ㄱ | ||
alert( str.match(/\p{L}/g) ); // null (немає збігів, \pне працює без прапорця "u") | ||
``` | ||
Ось основні категорії властивостей та їх підкатегорії: | ||
-Літери `L`: | ||
-мала літера `Ll` | ||
-модифікатор `Lm`, | ||
-регістр `Lt`, | ||
-велика літера `Lu`, | ||
-інші `Lo`. | ||
-Числа `N`: | ||
-десяткові цифри `Nd`, | ||
-числа позначені за допомогою літер `Nl`, | ||
-інші `No`. | ||
-Знаки пунктуації `P`: | ||
-з'єднувачі `Pc`, | ||
-тире `Pd`, | ||
-відкриваючі лапки `Pi`, | ||
-закриваючі лапки `Pf`, | ||
-відкриваючі дужки `Ps`, | ||
-закриваючі дужки `Pe`, | ||
-інші `Po`. | ||
-Знак `M` (акценти): | ||
-двокрапка `Mc`, | ||
-вкладення `Me`, | ||
-апострофи `Mn`. | ||
-Символи `S`: | ||
-валюти `Sc`, | ||
-модифікатори `Sk`, | ||
-математичні `Sm`, | ||
-інші `So`. | ||
-Розділювачі `Z`: | ||
-лінія `Zl`, | ||
-параграф `Zp`, | ||
-пробіл `Zs`. | ||
-Інші `C`: | ||
-контроль `Cc`, | ||
-форматування `Cf`, | ||
- не призначенні `Cn`, | ||
-для приватного користування `Co`, | ||
-сурогат `Cs`. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. Додайте тут, будь ласка, пустий рядок як було в оригінальній статті. Це потрібно знову ж таки для сумісності з англійським варіантом. | ||
Наприклад, якщо нам потрібно знайти маленькі літери, ми можемо написати `pattern:\p{Ll}`,знаки пунктуації `pattern:\p{P}`і так далі. | ||
Існують також інші похідні категорії, наприклад: | ||
- `Alphabetic` (`Alpha`),містить в собі літери`L`,а також числа позначені за допомогою літер`Nl` (наприклад, Ⅻ -символ для римської цифри12),і деякі інші символи `Other_Alphabetic` (`OAlpha`). | ||
- `Hex_Digit`містить шістнадцяткові числа: `0-9`, `a-f`. | ||
- ...І так далі. | ||
Юнікод підтримує велику кількість властивостей, і їхній повний перелік вимагав би дуже багато місця, тому ось посилання: | ||
-Перелік усіх властивостей за символом: <https://unicode.org/cldr/utility/character.jsp>. | ||
-Перелік усіх символів за властивістю: <https://unicode.org/cldr/utility/list-unicodeset.jsp>. | ||
-Псевдоніми властивостей: <https://www.unicode.org/Public/UCD/latest/ucd/PropertyValueAliases.txt>. | ||
-Повна база символів Юнікод у текстовому форматі з усіма властивостями: <https://www.unicode.org/Public/UCD/latest/ucd/>. | ||
###Приклад: шістнадцяткові числа | ||
Наприклад, пошукаймо шістнадцяткові числа, записані в форматі`xFF`,де замість`F`може бути будь-яка шістнадцяткова цифра (0..9 or A..F). | ||
Шістнадцяткову цифру можна позначити як `pattern:\p{Hex_Digit}`: | ||
```js run | ||
let regexp = /x\p{Hex_Digit}\p{Hex_Digit}/u; | ||
alert("число: xAF".match(regexp)); // xAF | ||
``` | ||
###Приклад: китайські ієрогліфи | ||
Пошукаймо китайські ієрогліфи. | ||
Нам допоможе властивість Юнікоду --`Script` (система письма),яка може мати значення: `Cyrillic`(Кирилиця), `Greek` (Грецька), `Arabic` (Арабська), `Han` (Китайська) та інші, [тут повний перелік](https://en.wikipedia.org/wiki/Script_(Unicode)). | ||
Для пошуку символів у певній системі письма ми повинні використати`pattern:Script=<value>`,наприклад для літер кирилиці: `pattern:\p{sc=Cyrillic}`,для китайських ієрогліфів: `pattern:\p{sc=Han}`,і так далі. | ||
```js run | ||
let regexp = /\p{sc=Han}/gu; //поверне китайські ієрогліфи | ||
let str = `HelloПривіт 你好 123_456`; | ||
alert( str.match(regexp) ); // 你,好 | ||
``` | ||
###Приклад: валюти | ||
Символи, які позначають валюту, такі як `$`, `€`, `¥`,мають властивість`pattern:\p{Currency_Symbol}`,короткий псевдонім: `pattern:\p{Sc}`. | ||
Використаємо його для пошуку цін у форматі «валюта, за якою йде цифра»: | ||
```js run | ||
let regexp = /\p{Sc}\d/gu; | ||
let str = `Ціни: $2, €1, ¥9`; | ||
alert( str.match(regexp) ); // $2,€1,¥9 | ||
``` | ||
Пізніше у розділі<info:regexp-quantifiers>ми побачимо, як шукати числа, які містять багато цифр. | ||
##Підсумки | ||
Прапорець `pattern:u`вмикає підтримку Юнікоду у регулярних виразах. | ||
Це означає дві речі: | ||
1.Символи розміром 4байти обробляються правильно: як один символ, а не як два 2-байтові символи. | ||
2.Працює пошук за допомогою властивостей Юнікоду: `\p{…}`. | ||
За допомогою властивостей Юнікоду ми можемо шукати слова певними мовами, спеціальні символи (лапки, валюти) тощо. |