From f82ce7fd3cc37a8256d8be626c83c3e2e5f265cc Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Thu, 28 May 2026 16:54:51 +0500 Subject: [PATCH 1/2] feat(25-strings): adapt content from Python version - 10-quotes: rewrite README with terminology section, escaping examples; exercise changed to file-not-found message with apostrophe+quotes; added strings.png asset - 15-escape-characters: rewrite README (cleaner structure, practical examples instead of GoT theme); exercise changed to \n usage hint - 20-string-concatenation: rewrite README with concatenation diagram and URL building context; exercise changed to GitHub URL assembly - 30-encoding: rewrite README with ASCII/Unicode/UTF-8 history; exercise updated to use String.fromCharCode() explicitly Co-Authored-By: Claude Sonnet 4.6 --- modules/25-strings/10-quotes/index.js | 2 +- modules/25-strings/10-quotes/ru/EXERCISE.md | 13 +- modules/25-strings/10-quotes/ru/README.md | 93 ++++++++----- .../10-quotes/ru/assets/strings.png | Bin 0 -> 15764 bytes modules/25-strings/10-quotes/ru/data.yml | 4 +- modules/25-strings/10-quotes/test.js | 2 +- .../25-strings/15-escape-characters/index.js | 2 +- .../15-escape-characters/ru/EXERCISE.md | 9 +- .../15-escape-characters/ru/README.md | 130 +++++++----------- .../25-strings/15-escape-characters/test.js | 2 +- .../20-string-concatenation/index.js | 4 +- .../20-string-concatenation/ru/EXERCISE.md | 9 +- .../20-string-concatenation/ru/README.md | 65 +++++---- .../20-string-concatenation/test.js | 2 +- modules/25-strings/30-encoding/ru/EXERCISE.md | 17 ++- modules/25-strings/30-encoding/ru/README.md | 74 ++++++---- 16 files changed, 224 insertions(+), 204 deletions(-) create mode 100644 modules/25-strings/10-quotes/ru/assets/strings.png diff --git a/modules/25-strings/10-quotes/index.js b/modules/25-strings/10-quotes/index.js index 2d308b6c..91104f22 100644 --- a/modules/25-strings/10-quotes/index.js +++ b/modules/25-strings/10-quotes/index.js @@ -1 +1 @@ -console.log('"Khal Drogo\'s favorite word is "athjahakar""'); +console.log('The file "user\'s_config.json" was not found.'); diff --git a/modules/25-strings/10-quotes/ru/EXERCISE.md b/modules/25-strings/10-quotes/ru/EXERCISE.md index e687f6c7..0ad2855a 100644 --- a/modules/25-strings/10-quotes/ru/EXERCISE.md +++ b/modules/25-strings/10-quotes/ru/EXERCISE.md @@ -1,12 +1,7 @@ - -Напишите программу, которая выведет на экран: - -``` -"Khal Drogo's favorite word is "athjahakar"" -``` - -Программа должна в точности вывести на экран именно эту фразу. Обратите внимание на кавычки в начале и в конце фразы: +Программа не нашла нужный файл и вывела сообщение с его названием. Напишите программу, которая выводит то же самое сообщение: ```text -"Khal Drogo's favorite word is "athjahakar"" +The file "user's_config.json" was not found. ``` + +Строка содержит и апостроф, и двойные кавычки — выберите подходящий способ их записи. diff --git a/modules/25-strings/10-quotes/ru/README.md b/modules/25-strings/10-quotes/ru/README.md index 2ed57ef1..3917ef24 100644 --- a/modules/25-strings/10-quotes/ru/README.md +++ b/modules/25-strings/10-quotes/ru/README.md @@ -1,3 +1,8 @@ +Строки в программировании на JavaScript используются очень часто и в самых разных ситуациях. С их помощью мы работаем с текстом, выводим сообщения на экран, обрабатываем пользовательский ввод и взаимодействуем с внешними системами. + +![Строки](./assets/strings.png) + +С точки зрения JavaScript строка представляет собой просто набор символов, заключённый в кавычки. Посмотрим на примеры. ```javascript 'Hello' @@ -7,81 +12,93 @@ '' ``` -Какие из этих пяти вариантов — строки? +Все эти варианты являются строками. + +- `'Hello'`, `'Goodbye'` и `'G'` представляют собой строки из нескольких или одного символа. +- `' '` является строкой, состоящей из одного пробела. +- `''` является пустой строкой, в ней нет ни одного символа. Играет такую же роль, как 0 в математике. + +То есть всё, что находится внутри кавычек, считается строкой, даже если там только пробел или вообще ничего нет. -С первыми двумя все понятно, это точно строки, мы уже работали с подобными конструкциями и говорили, что строки - это наборы символов. +## Терминология. Строка или строчка? -Любой одиночный символ в кавычках — это строка. Пустая строка `''` — это тоже строка. То есть строкой мы считаем всё, что находится внутри кавычек, даже если это пробел, один символ или вообще отсутствие символов. +В программировании есть терминологическая ловушка. -Ранее в уроках мы записывали строки в одинарных кавычках, но это не единственный способ. Можно использовать и двойные: +- Строка (string) является типом данных (то что разбирали выше), например `'hello'`. +- Строчка (line) является строкой текста в файле или в коде. + +Например, в коде ниже есть строчка, но не строка. ```javascript -// Стандарт кодирования airbnb, рекомендует -// использовать, по возможности, одинарные -console.log("Dracarys!"); +console.log(5); ``` -Представьте, что вы хотите напечатать строчку _Dragon's mother_. Апостроф перед буквой **s** — это такой же символ, как одинарная кавычка. Попробуем: +Чтобы избежать путаницы, в этом курсе мы будем использовать такие формулировки. + +- Строка, когда говорим о типе данных. +- Строчка, когда речь идёт о строках кода. + +## Одинарные и двойные кавычки + +В JavaScript строки можно записывать как в одинарных, так и в двойных кавычках. + +```javascript +console.log('Hello'); +console.log("Hello"); +``` + +По умолчанию принято использовать одинарные кавычки `'`, если внутри строки не требуется двойных. Этого стиля придерживается популярный стандарт оформления кода от [AirBnb](https://github.com/airbnb/javascript). + +## Проблема с кавычками внутри строки + +Представьте, что вы хотите напечатать строку *Dragon's mother*. В ней есть апостроф (*'s*), совпадающий с символом одинарной кавычки. Попробуем так. ```javascript console.log('Dragon's mother'); // Uncaught SyntaxError: missing ) after argument list ``` -Такая программа не будет работать. С точки зрения JavaScript, строка началась с одинарной кавычки, а потом закончилась после буквы **n**. Дальше были символы `s mother` без кавычек — значит, это не строка. А потом была одна открывающая строку кавычка, которая так и не закрылась: `');`. Этот код синтаксически некорректен (это видно даже по тому, как подсвечен код). - -Здесь нам помогут двойные кавычки. Такой вариант программы отработает корректно: +JavaScript решит, что строка заканчивается после слова `Dragon`, а остальное не распознает как валидный код, что вызовет синтаксическую ошибку. Чтобы избежать этого, обернём строку в двойные кавычки. ```javascript console.log("Dragon's mother"); ``` -Теперь интерпретатор знает, что строка началась с двойной кавычки — значит, и закончиться должна на двойной кавычке. А одинарная кавычка внутри стала частью строки. +Теперь JavaScript понимает, что одинарная кавычка внутри строки является обычным символом, а сама строка начинается и заканчивается двойными кавычками. -Верно и обратное. Если внутри строки мы хотим использовать двойные кавычки, то саму строку надо делать в одинарных. Причем количество кавычек внутри самой строки не важно. +Если внутри строки нужны двойные кавычки, а снаружи одинарные, проблем тоже не будет. -А что, если мы хотим создать такую строку: +```javascript +console.log('He said "No"'); +``` + +Иногда в строке встречаются оба типа кавычек. ``` Dragon's mother said "No" ``` -В ней есть и одинарные и двойные кавычки. Как быть в этой ситуации? Нужно каким-то образом сказать интерпретатору считать каждую кавычку частью строки, а не началом или концом строки. - -Для этого **экранируют** специальные символы. В нашем случае тот символ, который является признаком конца и начала строки, это либо одинарная кавычка, либо двойная, в зависимости от ситуации. Для экранирования используется обратный слеш `\`. +В этом случае, чтобы JavaScript не спутал кавычки внутри строки с внешними, используют символ экранирования — обратный слэш `\`. Он говорит интерпретатору, что следующий за ним символ является частью строки, а не управляющим символом. ```javascript -// Экранируется только ", так как в этой ситуации -// двойные кавычки имеют специальное значение console.log("Dragon's mother said \"No\""); // => Dragon's mother said "No" ``` -Посмотрите внимательно: нам нужно было добавить `\` для двойных кавычек, но не для одинарной (апостроф), потому что сама строка создана с двойными кавычками. Если бы строка создавалась с одинарными кавычками, то символ экранирования нужен был бы перед апострофом, но не перед двойными кавычками. +Здесь мы экранируем двойные кавычки внутри строки, заключённой в двойные кавычки. + +То же самое работает и в обратном случае. ```javascript -// \ не выводится, если после него идет обычный, -// а не специальный символ -console.log("Death is \so terribly final"); -// => Death is so terribly final +console.log('Dragon\'s mother said "No"'); +// => Dragon's mother said "No" ``` -А что, если нужно вывести сам обратный слеш? Точно так же, как и любой другой специальный символ, его надо экранировать самим собой. +## Как вывести обратный слэш + +Чтобы вывести сам обратный слэш, его тоже нужно экранировать. ```javascript console.log("\\"); // => \ ``` - -Вопрос на самопроверку, что выведет этот код? - -```javascript -console.log("\\ \\ \\\\ \\\ \'\""); -``` - -
-Ответ - -Этот код выведет такую строку: `\ \ \\ \ '"`. - -
diff --git a/modules/25-strings/10-quotes/ru/assets/strings.png b/modules/25-strings/10-quotes/ru/assets/strings.png new file mode 100644 index 0000000000000000000000000000000000000000..4cce328669ccf40fd56341be22d7b5e3e32fe3c8 GIT binary patch literal 15764 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 - [Шаблонные - строки](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/template_strings) + [Строки в + JavaScript](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/String) diff --git a/modules/25-strings/10-quotes/test.js b/modules/25-strings/10-quotes/test.js index 7556ba0b..ac4a9568 100644 --- a/modules/25-strings/10-quotes/test.js +++ b/modules/25-strings/10-quotes/test.js @@ -8,5 +8,5 @@ test('hello world', async () => { const firstArg = consoleLogSpy.mock.calls.join('\n'); - expect(firstArg).toBe('"Khal Drogo\'s favorite word is "athjahakar""'); + expect(firstArg).toBe('The file "user\'s_config.json" was not found.'); }); diff --git a/modules/25-strings/15-escape-characters/index.js b/modules/25-strings/15-escape-characters/index.js index 26f2390d..84f3a32f 100644 --- a/modules/25-strings/15-escape-characters/index.js +++ b/modules/25-strings/15-escape-characters/index.js @@ -1 +1 @@ -console.log('- Did Joffrey agree?\n- He did. He also said "I love using \\n".'); +console.log('Для разделения строк используйте "\\n"\nПример: console.log("строка1\\nстрока2")'); diff --git a/modules/25-strings/15-escape-characters/ru/EXERCISE.md b/modules/25-strings/15-escape-characters/ru/EXERCISE.md index 0c64edc3..9ffec32b 100644 --- a/modules/25-strings/15-escape-characters/ru/EXERCISE.md +++ b/modules/25-strings/15-escape-characters/ru/EXERCISE.md @@ -1,9 +1,8 @@ - -Напишите программу, которая выводит на экран: +Вы пишете программу, которая показывает пользователю подсказку о том, как разбить текст на строки. Выведите подсказку одним вызовом `console.log()`: ```text -- Did Joffrey agree? -- He did. He also said "I love using \n". +Для разделения строк используйте "\n" +Пример: console.log("строка1\nстрока2") ``` -При этом программа использует только один `console.log()`, но результат на экране должен выглядеть в точности, как показано выше. +Обратите внимание: `\n` в первой строке — это буквальный текст, а не перевод строки. diff --git a/modules/25-strings/15-escape-characters/ru/README.md b/modules/25-strings/15-escape-characters/ru/README.md index daa23c16..b6b55d95 100644 --- a/modules/25-strings/15-escape-characters/ru/README.md +++ b/modules/25-strings/15-escape-characters/ru/README.md @@ -1,49 +1,35 @@ - -Мы хотим показать диалог Матери Драконов со своим ребёнком: +Допустим, мы хотим вывести текст ниже в две строчки. ```text - Are you hungry? - Aaaarrrgh! ``` -Если вывести на экран строку с таким текстом: +Если мы просто передадим этот текст в `console.log()`, то JavaScript напечатает всё в одну строчку. Технически можно написать два подряд идущих `console.log()`, но представим, что мы хотим это сделать с помощью одного. ```javascript console.log('- Are you hungry?- Aaaarrrgh!'); +// => - Are you hungry?- Aaaarrrgh! ``` -то получится так: - -```text -- Are you hungry?- Aaaarrrgh! -``` - -Не то, что мы хотели. Строки расположены друг за другом, а не одна ниже другой. Нам нужно как-то сказать интерпретатору «нажать на энтер» — сделать перевод строки после вопросительного знака. Это можно сделать, используя символ перевода строки: `\n`. +Чтобы каждая из них начиналась с новой строки, нужно добавить перевод строки, то есть «нажать Enter». В программировании это реализуется через добавление специальных символов, в данном случае `\n`. Да, это не опечатка. Несмотря на то, что мы видим здесь два символа, с точки зрения JavaScript это один символ. ```javascript console.log('- Are you hungry?\n- Aaaarrrgh!'); ``` -результат: +Результат будет таким. ```text - Are you hungry? - Aaaarrrgh! ``` -`\n` — это специальный символ. В литературе его часто обозначают как *LF* (Line Feed). Возможно вы сейчас подумали, что это опечатка, ведь здесь мы видим два символа `\` и `n`, но это не так. С точки зрения компьютера — это один невидимый символ перевода строки. Доказательство: - -```javascript -// Мы это не изучали, но вы должны знать правду -// Ниже код, который возвращает длину строки -'a'.length; // 1 -'\n'.length; // 1 !!! -'\n\n'.length; // 2 !!! -``` +## Что такое `\n`? -Почему так сделано? `\n` — всего лишь способ записать символ перевода строки, но сам перевод строки по своему смыслу – это один символ, правда, невидимый. Именно поэтому и возникла такая задача. Нужно было как-то представить его на клавиатуре. А поскольку количество знаков на клавиатуре ограничено и отдано под самые важные, то все специальные символы реализуются в виде таких обозначений. +`\n` является управляющей последовательностью (англ. escape sequence, иногда говорят «экранированная последовательность»). Она обозначает перевод строки, но не отображается напрямую. Вы не увидите `\n` в выводе программы, так как она влияет только на расположение текста. -Символ перевода строки не является чем-то специфичным для программирования. Все, кто хоть раз печатал на компьютере, использовал перевод строки, нажимая на Enter. Во многих редакторах есть опция, позволяющая включить отображение невидимых символов. С помощью этой опции можно понять, где находятся невидимые символы (хотя это всего лишь схематичное отображение, у этих символов нет графического представления, они невидимые): +В текстовых редакторах при нажатии Enter добавляется невидимый символ LF (Line Feed). Именно его и означает `\n`. Иногда такие символы можно увидеть, если включить отображение спецсимволов. ```text - Привет!¶ @@ -51,78 +37,60 @@ console.log('- Are you hungry?\n- Aaaarrrgh!'); - Как дела? ``` -Устройство, которое выводит соответствующий текст, учитывает этот символ. Например, принтер при встрече с LF протаскивает бумагу вверх на одну строку, а текстовый редактор переносит весь последующий текст ниже, также на одну строку. +Принтеры, редакторы и интерпретаторы JavaScript понимают `\n` как команду начать строку с новой строки. -`\n` — это пример **экранирующей последовательности** (escape sequence). Их ещё называют управляющими конструкциями. Хотя таких символов не один десяток, в программировании часто встречаются всего несколько. Кроме перевода строки, к таким символам относятся табуляция (разрыв, получаемый при нажатии на кнопку Tab) и возврат каретки (только в Windows). Нам, программистам, часто нужно использовать перевод строки `\n` для правильного форматирования текста. +## Примеры использования `\n` -```javascript -console.log('Gregor Clegane\nDunsen\nPolliver\nChiswyck'); -``` - -На экран выведется: +Вот как JavaScript обрабатывает управляющую последовательность `\n`. ```text -Gregor Clegane -Dunsen -Polliver -Chiswyck +В коде 'Hello\nWorld' + ↓ +На экране Hello + World ``` -Обратите внимание на следующие моменты: - -1. Не имеет значения, что стоит перед или после `\n`: символ или пустая строка. Перевод будет обнаружен и выполнен в любом случае. - -2. Помните, что строка может содержать один символ или вообще ноль символов. А еще строка может содержать только `\n`. Проанализируйте следующий пример: - - ```javascript - console.log('\n'); - console.log('Dunsen'); - ``` - - Здесь мы сначала выводим строку «перевод строки», а потом делаем вывод обыкновенной строки. Программа выведет на экран: - - ```text - - Dunsen - ``` - - Почему перед строкой *Dunsen* появилось две пустые строки, а не одна? Дело в том, что `console.log()` при выводе значения автоматически добавляет в конец символ перевода строки. Таким образом, один перевод строки мы указали явно, передав этот символ экранирующей последовательности аргументом в функцию, а второй перевод строки добавлен самой функцией автоматически. - - Ещё пример кода: - - ```javascript - console.log('Polliver'); - console.log('Gregor Clegane'); - console.log(); - console.log('Chiswyck'); - console.log('\n'); - console.log('Dunsen'); - ``` - - Вывод будет таким: - - ```text - Polliver - Gregor Clegane - - Chiswyck +Местоположение `\n` меняет итоговый вывод. +```javascript +console.log('Hello\nWorld'); +// Hello +// World + +console.log('Hello \nWorld'); +// Hello +// World (в конце первой строки есть пробел) + +console.log('Hello\n World'); +// Hello +// World (во второй строке в начале пробел) + +console.log('Hello\n\nWorld'); +// Hello +// +// World (пустая строка между ними) +``` - Dunsen - ``` +Пробелы до или после `\n` также учитываются. JavaScript воспринимает их как обычные символы и отображает в выводе. - Сейчас у вас достаточно знаний, чтобы самостоятельно разобраться и понять, почему вывод сформировался именно таким образом. +## Как вывести сам символ `\n` -3. Если нам понадобится вывести `\n` именно как текст (два отдельных печатных символа), то можно воспользоваться уже известным нам способом экранирования, добавив еще один `\` в начале. То есть последовательность `\\n` отобразится как символы `\` и `n`, идущие друг за другом. +`\n` в JavaScript является управляющей последовательностью. Если вам нужно вывести именно символы `\` и `n`, а не перевод строки, их нужно экранировать. Для этого перед обратным слешем добавляют ещё один слеш. ```javascript -console.log('Joffrey loves using \\n'); +console.log('Hello\\nWorld'); +// Hello\nWorld ``` -на экран выйдет: +## Другие управляющие последовательности -```text -Joffrey loves using \n -``` +Кроме `\n`, в JavaScript есть и другие управляющие последовательности. + +- `\t` обозначает табуляцию (эквивалент клавиши Tab). +- `\r` обозначает возврат каретки (используется в Windows, но редко применяется в современном коде). +- В программировании чаще всего используют именно `\n`, его достаточно для большинства задач. + +## Важные детали -Небольшое, но важное замечание про Windows. В Windows для перевода строк по умолчанию используется `\r\n`. Такая комбинация хорошо работает только в Windows, но создаёт проблемы при переносе в другие системы (например, когда в команде разработчиков есть пользователи как Windows, так и Linux). Дело в том, что последовательность `\r\n` имеет разную трактовку в зависимости от выбранной кодировки (рассматривается позже). По этой причине, в среде разработчиков принято всегда использовать `\n` без `\r`, так как LF всегда трактуется одинаково и отлично работает в любой системе. Не забудьте настроить ваш редактор на использование `\n`. +- `\n` является одним символом, несмотря на то, что в коде он записан как два (`\` и `n`). +- На Windows по умолчанию используется комбинация `\r\n`, но в JavaScript (и вообще в кроссплатформенной разработке) принято использовать только `\n`, чтобы избежать проблем при переносе кода между системами. diff --git a/modules/25-strings/15-escape-characters/test.js b/modules/25-strings/15-escape-characters/test.js index f28480d2..a0f2859d 100644 --- a/modules/25-strings/15-escape-characters/test.js +++ b/modules/25-strings/15-escape-characters/test.js @@ -9,6 +9,6 @@ test('hello world', async () => { const firstArg = consoleLogSpy.mock.calls.join('\n'); expect(firstArg).toBe( - '- Did Joffrey agree?\n- He did. He also said "I love using \\n".', + 'Для разделения строк используйте "\\n"\nПример: console.log("строка1\\nстрока2")', ); }); diff --git a/modules/25-strings/20-string-concatenation/index.js b/modules/25-strings/20-string-concatenation/index.js index 419a3cd6..b48b4ac3 100644 --- a/modules/25-strings/20-string-concatenation/index.js +++ b/modules/25-strings/20-string-concatenation/index.js @@ -1,5 +1,3 @@ -/* eslint no-useless-concat: 0 */ - // BEGIN -console.log('Winter ' + 'came ' + 'for ' + 'the ' + 'House ' + 'of ' + 'Frey.'); +console.log('https://' + 'github.com' + '/' + 'hexlet' + '/' + 'exercises-javascript'); // END diff --git a/modules/25-strings/20-string-concatenation/ru/EXERCISE.md b/modules/25-strings/20-string-concatenation/ru/EXERCISE.md index 0b97df95..0462c8ba 100644 --- a/modules/25-strings/20-string-concatenation/ru/EXERCISE.md +++ b/modules/25-strings/20-string-concatenation/ru/EXERCISE.md @@ -1,8 +1,7 @@ +Сайт автоматически формирует ссылки на страницы репозиториев, собирая их из отдельных частей. Соберите ссылку с помощью конкатенации и выведите на экран: -Выведите на экран - -``` -Winter came for the House of Frey. +```text +https://github.com/hexlet/exercises-javascript ``` -используя конкатенацию слов. +Каждый компонент URL — отдельная строка: протокол, домен, имя владельца, имя репозитория. diff --git a/modules/25-strings/20-string-concatenation/ru/README.md b/modules/25-strings/20-string-concatenation/ru/README.md index 86791ea1..1fd9b828 100644 --- a/modules/25-strings/20-string-concatenation/ru/README.md +++ b/modules/25-strings/20-string-concatenation/ru/README.md @@ -1,46 +1,65 @@ +Часто строки нужно собирать из нескольких частей, например объединить имя и фамилию, добавить единицу измерения или составить текст из шаблона. Для этого используется операция конкатенации, то есть склеивания строк. -В веб-разработке программы постоянно оперируют строками. Всё, что мы видим на сайтах, так или иначе представлено в виде текста. Этот текст чаще всего динамический, то есть полученный из разных частей, которые соединяются вместе. Операция соединения строк в программировании называется **конкатенацией**. +## Как объединять строки + +В JavaScript строки объединяются с помощью оператора `+`. Несмотря на то, что этот оператор используется и для сложения чисел, в случае строк он означает объединение, то есть склеивание содержимого. ```javascript -// Оператор такой же, как и при сложении чисел -// но здесь он имеет другой смысл (семантику) console.log('Dragon' + 'stone'); // => Dragonstone ``` -Склеивание строк всегда происходит в том же порядке, в котором записаны операнды. Левый операнд становится левой частью строки, а правый — правой. +Порядок имеет значение. Сначала идёт левая часть (`'Dragon'`), потом правая (`'stone'`). Результат получается в том порядке, в котором указаны операнды. -Вот еще несколько примеров: +Вот как работает объединение нескольких строк: -```javascript -console.log('Kings' + 'wood'); // => Kingswood +```text +'Hello' + ', ' + 'World!' +└──┬──┘ └┬┘ └──┬───┘ + └────┬───┘ │ + 'Hello, ' + 'World!' + └──────┬───────┘ + 'Hello, World!' +``` -// Обратный порядок слов -console.log('road' + 'Kings'); // => roadKings +Примеры. -// Конкатенировать можно абсолютно любые строки -console.log("King's" + 'Landing'); // => King'sLanding +```javascript +console.log('Kings' + 'wood'); // => Kingswood +console.log('Kings' + 'road'); // => Kingsroad +// Здесь снаружи двойные кавычки, потому что внутри есть одиночная +console.log("King's" + 'Landing'); // => King'sLanding ``` -Как видите, строки можно склеивать, даже если они записаны с разными кавычками. +JavaScript позволяет объединять строки, даже если они записаны в разных кавычках. Главное, чтобы обе части были строками. -В последнем примере название города получилось с ошибкой: *King's Landing* нужно писать через пробел. Но в наших начальных строках не было пробелов, а пробелы в самом коде слева и справа от символа `+` не имеют значения, потому что они не являются частью строк. +## Пробел тоже является символом -Выхода из этой ситуации два: +При объединении JavaScript не вставляет пробелы автоматически. Если между частями должен быть пробел, его нужно указать вручную. ```javascript -// Оба способа равнозначны +// Пробел в конце первой строки +console.log("King's " + 'Landing'); // => King's Landing -// Ставим пробел в левой части -console.log("King's " + 'Landing'); // => King's Landing -// Ставим пробел в правой части -console.log("King's" + ' Landing'); // => King's Landing +// Пробел в начале второй строки +console.log("King's" + ' Landing'); // => King's Landing ``` -Пробел — такой же символ, как и другие. Чем больше пробелов, тем шире отступы: +Результат будет одинаковый. Но если пробел не добавить, то слова склеятся. -```javascript -console.log("King's " + ' Landing'); // => King's Landing +## Управляющие последовательности -console.log("King's " + ' Landing'); // => King's Landing +В строках можно использовать управляющие последовательности, например `\n` для переноса строки или `\t` для табуляции. При конкатенации они работают так же, как и любые другие символы. + +```javascript +console.log('Hello,' + '\n' + 'World!'); +// Hello, +// World! ``` + +## Заключение + +Конкатенация представляет собой объединение строк через `+`, и строки можно объединять независимо от типа кавычек. + +- Склеивание происходит строго в порядке слева направо. +- Пробелы не добавляются автоматически, их нужно включать в строки вручную. diff --git a/modules/25-strings/20-string-concatenation/test.js b/modules/25-strings/20-string-concatenation/test.js index 0d7c695e..2dcdd835 100644 --- a/modules/25-strings/20-string-concatenation/test.js +++ b/modules/25-strings/20-string-concatenation/test.js @@ -8,5 +8,5 @@ test('hello world', async () => { const firstArg = consoleLogSpy.mock.calls.join('\n'); - expect(firstArg).toBe('Winter came for the House of Frey.'); + expect(firstArg).toBe('https://github.com/hexlet/exercises-javascript'); }); diff --git a/modules/25-strings/30-encoding/ru/EXERCISE.md b/modules/25-strings/30-encoding/ru/EXERCISE.md index 6b072427..c9f56e8e 100644 --- a/modules/25-strings/30-encoding/ru/EXERCISE.md +++ b/modules/25-strings/30-encoding/ru/EXERCISE.md @@ -1,14 +1,13 @@ - -В JavaScript можно «запросить» и вывести на экран любой символ из кодировки ASCII. Например: +Программа получает числовые коды символов и выводит их на экран — это удобно, когда символ сложно набрать с клавиатуры. Найдите символы с кодами 126, 94 и 37 в таблице ASCII и выведите каждый на отдельной строке с помощью функции `String.fromCharCode()`. ```javascript -console.log(String.fromCharCode(63)); +console.log(String.fromCharCode(...)); +console.log(String.fromCharCode(...)); +console.log(String.fromCharCode(...)); ``` -На экран выведется символ с номером 63 — вопросительный знак `?`. Таким способом можно выводить любой символ. - -Найдите в интернете таблицу кодов ASCII. Можно использовать запросы типа "ascii codes table" или «коды ascii». Обычно в таких таблицах коды указаны сразу в нескольких системах счисления: десятичной, двоичной, восьмеричной и шестнадцатеричной. Нас интересует десятичный код (*dec* или *decimal*). - -Используя пример выше и найденную таблицу, выведите на экран символы `~`, `^` и `%` (каждый на своей собственной строке). +Например, символ `?` имеет код 63: -(Конечно, можно «обмануть» тесты и просто сделать что-то типа `console.log('~')`, но так будет совсем неинтересно :) +```javascript +console.log(String.fromCharCode(63)); // вывод: ? +``` diff --git a/modules/25-strings/30-encoding/ru/README.md b/modules/25-strings/30-encoding/ru/README.md index fa65857a..7f5c8dd3 100644 --- a/modules/25-strings/30-encoding/ru/README.md +++ b/modules/25-strings/30-encoding/ru/README.md @@ -1,37 +1,63 @@ +На самом базовом уровне компьютер работает только с нулями и единицами, что составляет так называемый двоичный код. Каждую единицу или ноль называют битом (от binary digit, «двоичная цифра»). -На самом глубоком уровне компьютер оперирует исключительно цифрами `0` и `1`. Это так называемый [двоичный код](https://ru.wikipedia.org/wiki/Двоичный_код), а единички и нули называются битами, от "binary digit" — «двоичная цифра». +Любые данные в компьютере представлены просто как последовательность битов, например изображения, музыка и текст. Привычные нам числа из десятичной системы тоже можно представить в двоичной форме. -Обычные, привычные нам числа в десятичной системе счисления, закодированы с помощью двоичных чисел: +- 0 → `0` +- 1 → `1` +- 2 → `10` -- 0 ← 0 -- 1 ← 1 -- 2 ← 10 -- 3 ← 11 -- 4 ← 100 -- 5 ← 101 +## Как закодировать текст? -Но как быть с текстом? Компьютер на самом деле не знает ничего о буквах, знаках пунктуации и прочих текстовых символах. Все эти символы также закодированы числами. +Компьютер не «понимает» текст. Чтобы работать с буквами и другими символами, их тоже нужно превратить в числа. Это делают с помощью кодировок, то есть таблиц, в которых каждому символу соответствует определённое число. -Можно взять английский алфавит и дать каждой букве число, начиная с единицы по порядку: +Самый простой способ состоит в том, чтобы пронумеровать буквы, начиная с 1. -- a ← 1 -- b ← 2 -- c ← 3 -- d ← 4 -- ... -- z ← 26 +- `a` → `1` +- `b` → `2` +- ...и так до `z` → `26` -Далее можно научить компьютер понимать эту таблицу и переводить текст в числа и наоборот — числа в текст: +Теперь мы можем представить слово `hello` как набор чисел. -- `hello` → `8` `5` `12` `12` `15` -- `7` `15` `15` `4` → `good` +```text +h e l l o +↓ ↓ ↓ ↓ ↓ +8 5 12 12 15 +``` -Подобные таблицы, в которых сопоставляются буквы и числа, называются кодировками. Кроме букв алфавита, в таблицы кодировок входят знаки препинания и другие полезные символы. Вы наверняка сталкивались с кодировками, например, [ASCII](https://ru.wikipedia.org/wiki/ASCII) или [UTF-8](https://ru.wikipedia.org/wiki/UTF-8). +А `good` превращается в такую последовательность. -Разные кодировки содержат различное количество символов. Изначально небольших таблиц вроде ASCII было достаточно для большинства задач. Но в ней есть только латинские буквы, несколько простых символов вроде `%` и `?` и специальные управляющие символы типа перевода строки. +```text +g o o d +↓ ↓ ↓ ↓ +7 15 15 4 +``` -С распространением компьютеров, разным странам понадобились свои, более широкие таблицы. В том числе для кириллических букв, иероглифов, арабской вязи, дополнительных математических и типографских символов, а впоследствии — даже для эмодзи-смайликов. +Программа не знает, что это слово. Она просто видит инструкцию «нужно отобразить символ с кодом 8, потом с кодом 5 и т.д.». -Сегодня в большинстве случаев используется один из вариантов [юникода](https://ru.wikipedia.org/wiki/Юникод) — *utf-8*. Он включает в себя знаки почти всех письменных языков мира. Благодаря этому, письмо, сформированное человеком в Китае на китайском, без проблем можно открыть и увидеть в первозданном виде на компьютере в Финляндии (поймет он его или нет, это уже другой вопрос). +## ASCII. Первая массовая кодировка -С кодированием текста и кодировками программисты встречаются в своей жизни регулярно. Поддержка юникода у разных языков программирования выполнена на разном уровне. Кроме того, кодировки нужно явно указывать при работе и с базами данных, и с файлами. +Первые компьютеры работали в основном с английским языком. Для него в 1960-х годах придумали таблицу ASCII, включавшую 128 символов, в том числе латинский алфавит, цифры, знаки препинания, спецсимволы (`@`, `#`, `!`, `\n`) и управляющие коды. + +Этого хватало для первых программ, но не для всего мира. + +Когда компьютеры начали использовать в других странах, возникла проблема. В ASCII нет кириллицы, иероглифов, арабского письма, ударений, валютных символов и т. д. Каждая страна или компания начала делать свою кодировку. Все эти кодировки были несовместимы между собой, что приводило к настоящему хаосу. + +## Unicode и UTF-8. Конец бардака + +Чтобы всё починить, в 1990-х начали создавать универсальную таблицу Unicode, которая содержит символы всех письменных систем мира, в том числе латинский алфавит и кириллицу, китайское и арабское письмо, математические знаки, древнеегипетское письмо и даже эмодзи. + +Внутри Unicode есть несколько форматов хранения. Наиболее распространённым из них является UTF-8. Он компактно кодирует английские символы, но может расширяться под любые другие. + +Сегодня UTF-8 является стандартом по умолчанию в интернете, JavaScript, Linux, базах данных и редакторах кода. + +## Зачем это знать программисту? + +- Вы будете работать с текстом, и ошибки кодировки по-прежнему случаются, особенно при чтении файлов, обработке данных, взаимодействии с API и базами данных. +- JavaScript по умолчанию использует Unicode для строк. +- Нужно уметь диагностировать проблемы. Например, если видите «кракозябры», это почти наверняка ошибка кодировки. + +В JavaScript можно получить символ по его числовому коду с помощью `String.fromCharCode()`: + +```javascript +console.log(String.fromCharCode(63)); // => ? +``` From 2a02e4f3f8126a32dafa8758895c4831e786ce9a Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Fri, 29 May 2026 17:11:54 +0500 Subject: [PATCH 2/2] fix lint --- modules/25-strings/15-escape-characters/index.js | 4 +++- modules/25-strings/20-string-concatenation/index.js | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/25-strings/15-escape-characters/index.js b/modules/25-strings/15-escape-characters/index.js index 84f3a32f..0789496d 100644 --- a/modules/25-strings/15-escape-characters/index.js +++ b/modules/25-strings/15-escape-characters/index.js @@ -1 +1,3 @@ -console.log('Для разделения строк используйте "\\n"\nПример: console.log("строка1\\nстрока2")'); +console.log( + 'Для разделения строк используйте "\\n"\nПример: console.log("строка1\\nстрока2")', +); diff --git a/modules/25-strings/20-string-concatenation/index.js b/modules/25-strings/20-string-concatenation/index.js index b48b4ac3..e01c741b 100644 --- a/modules/25-strings/20-string-concatenation/index.js +++ b/modules/25-strings/20-string-concatenation/index.js @@ -1,3 +1,5 @@ // BEGIN -console.log('https://' + 'github.com' + '/' + 'hexlet' + '/' + 'exercises-javascript'); +console.log( + 'https://' + 'github.com' + '/' + 'hexlet' + '/' + 'exercises-javascript', +); // END