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
|`\u{X…XXXXXX}` (от 1 до 6 шестнадцатеричных цифр)|Символ в кодировке UTF-32 с шестнадцатеричным кодом от U+0000 до U+10FFFF. Некоторые редкие символы кодируются двумя 16-битными словами и занимают 4 байта. Так можно вставлять символы с длинным кодом. |
У этого метода есть два дополнительных аргумента, которые указаны в [документации](mdn:js/String/localeCompare). Первый позволяет указать язык (по умолчанию берётся из окружения) — от него зависит порядок букв. Второй — определить дополнительные правила, такие как чувствительность к регистру, а также следует ли учитывать различия между `"a"` и `"á"`.
559
541
560
-
## Как всё устроено, Юникод
561
-
562
-
```warn header="Глубокое погружение в тему"
563
-
Этот раздел более подробно описывает, как устроены строки. Такие знания пригодятся, если вы намерены работать с эмодзи, редкими математическими символами, иероглифами, либо с ещё какими-то редкими символами.
564
-
565
-
Если вы не планируете их поддерживать, эту секцию можно пропустить.
566
-
```
567
-
568
-
### Суррогатные пары
569
-
570
-
Все часто используемые символы имеют 2-байтовые коды. Буквы в большинстве европейских языков, цифры и даже большинство иероглифов имеют 2-байтовое представление.
571
-
572
-
Но 2 байта допускают только 65536 комбинаций, так что на все символы этого, разумеется, не хватит. Поэтому редкие символы кодируются парой 2-байтовых символов, также называемые "суррогатной парой".
573
-
574
-
Длина таких символов равна `2`:
575
-
576
-
```js run
577
-
alert( '𝒳'.length ); // 2, MATHEMATICAL SCRIPT CAPITAL X
Обратите внимание, суррогатные пары не существовали, когда был создан JavaScript, поэтому язык не обрабатывает их адекватно!
583
-
584
-
Ведь в каждой из этих строк только один символ, а `length` показывает длину `2`.
585
-
586
-
`String.fromCodePoint` и `str.codePointAt` — два редких метода, правильно работающие с суррогатными парами, но они и появились в языке недавно. До них были только [String.fromCharCode](mdn:js/String/fromCharCode) и [str.charCodeAt](mdn:js/String/charCodeAt). Эти методы, вообще, делают то же самое, что `fromCodePoint/codePointAt`, но не работают с суррогатными парами.
587
-
588
-
Получить символ, представленный суррогатной парой, может быть не так просто, потому что суррогатная пара интерпретируется как два символа:
589
-
590
-
```js run
591
-
alert( '𝒳'[0] ); // странные символы...
592
-
alert( '𝒳'[1] ); // ...части суррогатной пары
593
-
```
594
-
595
-
Части суррогатной пары не имеют смысла сами по себе, так что вызовы `alert` в этом примере покажут лишь мусор.
596
-
597
-
Технически, суррогатные пары возможно обнаружить по их кодам: если код символа находится в диапазоне `0xd800..0xdbff`, то это — первая часть суррогатной пары. Следующий символ — вторая часть — имеет код в диапазоне `0xdc00..0xdfff`. Эти два диапазона выделены исключительно для суррогатных пар по стандарту.
598
-
599
-
В данном случае:
600
-
601
-
```js run
602
-
// charCodeAt не поддерживает суррогатные пары, поэтому возвращает код для их частей
603
-
604
-
alert( '𝒳'.charCodeAt(0).toString(16) ); // d835, между 0xd800 и 0xdbff
605
-
alert( '𝒳'.charCodeAt(1).toString(16) ); // dcb3, между 0xdc00 и 0xdfff
606
-
```
607
-
608
-
Дальше в главе <info:iterable> будут ещё способы работы с суррогатными парами. Для этого есть и специальные библиотеки, но нет достаточно широко известной, чтобы предложить её здесь.
609
-
610
-
### Диакритические знаки и нормализация
611
-
612
-
Во многих языках есть символы, состоящие из некоторого основного символа со знаком сверху или снизу.
613
-
614
-
Например, буква `a` — это основа для `àáâäãåā`. Наиболее используемые составные символы имеют свой собственный код в таблице UTF-16. Но не все, в силу большого количества комбинаций.
615
-
616
-
Чтобы поддерживать любые комбинации, UTF-16 позволяет использовать несколько Юникодных символов: основной и дальше один или несколько особых символов-знаков.
617
-
618
-
Например, если после `S` добавить специальный символ "точка сверху" (код `\u0307`), он отобразится как Ṡ.
619
-
620
-
```js run
621
-
alert( 'S\u0307' ); // Ṡ
622
-
```
623
-
624
-
Если надо добавить сверху (или снизу) ещё один знак — без проблем, просто добавляем соответствующий символ.
625
-
626
-
Например, если добавить символ "точка снизу" (код `\u0323`), отобразится S с точками сверху и снизу: `Ṩ`.
627
-
628
-
Добавляем два символа:
629
-
630
-
```js run
631
-
alert( 'S\u0307\u0323' ); // Ṩ
632
-
```
633
-
634
-
Это даёт большую гибкость, но из-за того, что порядок дополнительных символов может быть различным, мы получаем проблему сравнения символов: можно представить по-разному символы, которые ничем визуально не отличаются.
635
-
636
-
Например:
637
-
638
-
```js run
639
-
let s1 ='S\u0307\u0323'; // Ṩ, S + точка сверху + точка снизу
640
-
let s2 ='S\u0323\u0307'; // Ṩ, S + точка снизу + точка сверху
641
-
642
-
alert( `s1: ${s1}, s2: ${s2}` );
643
-
644
-
alert( s1 == s2 ); // false, хотя на вид символы одинаковы (?!)
645
-
```
646
-
647
-
Для решения этой проблемы есть алгоритм "Юникодной нормализации", приводящий каждую строку к единому "нормальному" виду.
648
-
649
-
Его реализует метод [str.normalize()](mdn:js/String/normalize).
Разумеется, так происходит не всегда. Просто Ṩ — это достаточно часто используемый символ, поэтому создатели UTF-16 включили его в основную таблицу и присвоили ему код.
664
-
665
-
Подробнее о правилах нормализации и составлении символов можно прочитать в дополнении к стандарту Юникод: [Unicode Normalization Forms](http://www.unicode.org/reports/tr15/). Для большинства практических целей информации из этого раздела достаточно.
666
-
667
542
## Итого
668
543
669
544
- Есть три типа кавычек. Строки, использующие обратные кавычки, могут занимать более одной строки в коде и включать выражения `${…}`.
670
545
- Строки в JavaScript кодируются в UTF-16.
671
-
- Есть специальные символы, такие как `\n`, и можно добавить символ по его Юникодному коду, используя `\u…`.
546
+
- Есть специальные символы, такие как разрыв строки `\n`.
672
547
- Для получения символа используйте `[]`.
673
548
- Для получения подстроки используйте `slice` или `substring`.
674
549
- Для того, чтобы перевести строку в нижний или верхний регистр, используйте `toLowerCase/toUpperCase`.
- …и другие, которые вы можете найти в [справочнике](mdn:js/String).
683
558
684
-
Также есть методы для поиска и замены с использованием регулярных выражений. Но это отдельная большая тема, поэтому ей посвящена отдельная глава учебника <info:regular-expressions>.
559
+
Для строк предусмотрены методы для поиска и замены с использованием регулярных выражений. Но это отдельная большая тема, поэтому ей посвящена отдельная глава учебника <info:regular-expressions>.
560
+
561
+
Также, на данный момент важно знать, что строки основаны на кодировке Юникод, и поэтому иногда могут возникать проблемы со сравнениями. Подробнее о Юникоде в главе <info:unicode>.
0 commit comments