Skip to content

Commit f6111a5

Browse files
authored
Update article.md
1 parent ed6e52a commit f6111a5

File tree

1 file changed

+0
-107
lines changed

1 file changed

+0
-107
lines changed

1-js/05-data-types/03-string/article.md

Lines changed: 0 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -557,113 +557,6 @@ alert( 'Österreich'.localeCompare('Zealand') ); // -1
557557
558558
У этого метода есть два дополнительных аргумента, которые указаны в [документации](mdn:js/String/localeCompare). Первый позволяет указать язык (по умолчанию берётся из окружения) — от него зависит порядок букв. Второй — определить дополнительные правила, такие как чувствительность к регистру, а также следует ли учитывать различия между `"a"` и `""`.
559559
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
578-
alert( '😂'.length ); // 2, FACE WITH TEARS OF JOY
579-
alert( '𩷶'.length ); // 2, редкий китайский иероглиф
580-
```
581-
582-
Обратите внимание, суррогатные пары не существовали, когда был создан 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).
650-
651-
```js run
652-
alert( "S\u0307\u0323".normalize() == "S\u0323\u0307".normalize() ); // true
653-
```
654-
655-
Забавно, но в нашем случае `normalize()` "схлопывает" последовательность из трёх символов в один: `\u1e68` — S с двумя точками.
656-
657-
```js run
658-
alert( "S\u0307\u0323".normalize().length ); // 1
659-
660-
alert( "S\u0307\u0323".normalize() == "\u1e68" ); // true
661-
```
662-
663-
Разумеется, так происходит не всегда. Просто Ṩ — это достаточно часто используемый символ, поэтому создатели UTF-16 включили его в основную таблицу и присвоили ему код.
664-
665-
Подробнее о правилах нормализации и составлении символов можно прочитать в дополнении к стандарту Юникод: [Unicode Normalization Forms](http://www.unicode.org/reports/tr15/). Для большинства практических целей информации из этого раздела достаточно.
666-
667560
## Итого
668561
669562
- Есть три типа кавычек. Строки, использующие обратные кавычки, могут занимать более одной строки в коде и включать выражения `${…}`.

0 commit comments

Comments
 (0)