11-01-25 10:36:21
В JavaScript символы в строках хранятся в кодировке UTF-16. Каждый символ представлен одним или несколькими 16-битными кодовыми единицами. Для большинства обычных символов достаточно одной кодовой единицы, но некоторые символы, такие как эмодзи или редкие знаки, требуют двух кодовых единиц. Такие символы называются суррогатными парами.
Кодовые точки
Unicode присваивает каждому символу уникальное число, называемое кодовой точкой, которое представлено в формате U+XXXX, где XXXX — это шестнадцатеричное значение.
Примеры кодовых точек Unicode:
Длина строки и суррогатные пары
В JavaScript свойство length строки подсчитывает количество UTF-16 кодовых единиц, а не реальных символов.
const str = "😀"; // Эмодзи
console.log(str.length); // Вывод: 2 (две кодовые единицы UTF-16)
console.log(str[0]); // Вывод: � (первая часть пары)
console.log(str[1]); // Вывод: � (вторая часть пары)
Экранирование символов Unicode
Вы можете использовать escape-последовательности Unicode для представления символов в строках.
// Escape-последовательность Unicode
const letterA = "\u0041";
console.log(letterA); // Вывод: A
// Unicode для эмодзи
const smiley = "\u{1F600}";
console.log(smiley); // Вывод: 😀
Доступ к кодовым точкам
Для работы с символами Unicode можно использовать метод String.prototype.codePointAt для получения реальной кодовой точки.
const emoji = "😀";
console.log(emoji.codePointAt(0)); // Вывод: 128512 (U+1F600)
Создание строк из кодовых точек
Вы можете создать символ из кодовой точки, используя метод String.fromCodePoint.
const codePoint = 128512; // Эмодзи 😀
const character = String.fromCodePoint(codePoint);
console.log(character); // Вывод: 😀
Для итерации по каждому символу строки, включая суррогатные пары, используйте цикл for...of.
const str = "Привет 😀";
for (const char of str) {
console.log(char);
}
// Вывод:
// П
// р
// и
// в
// е
// т
// 😀
Иногда визуально одинаковые символы могут иметь разные представления в Unicode. Например, символ "é" может быть представлен как одна кодовая точка (U+00E9) или как комбинация e (U+0065) и акцента (U+0301). Для решения этой проблемы используется нормализация Unicode.
JavaScript предоставляет метод normalize для строк.
const str1 = "\u00E9"; // é (одна кодовая точка)
const str2 = "e\u0301"; // e + акцент (две кодовые точки)
console.log(str1 === str2); // Вывод: false (разные кодовые точки)
const normalizedStr1 = str1.normalize();
const normalizedStr2 = str2.normalize();
console.log(normalizedStr1 === normalizedStr2); // Вывод: true (после нормализации)
1. Международная поддержка
Unicode позволяет JavaScript работать с текстом на различных языках.
const greeting = "你好"; // Привет на китайском
console.log(greeting); // Вывод: 你好
console.log(greeting.length); // Вывод: 2
2. Работа с эмодзи
С увеличением использования эмодзи в современных приложениях правильная работа с ними становится необходимостью.
const text = "Я люблю JavaScript ❤️😀";
console.log([...text]); // Правильное разделение на отдельные символы
// Вывод: [ 'Я', ' ', 'л', 'ю', 'б', 'л', 'ю', ' ', 'J', 'a', 'v', 'a', 'S', 'c', 'r', 'i', 'p', 't', ' ', '❤', '️', '😀' ]
3. Создание удобных URL или имен файлов
Unicode помогает создавать читаемые "человеческие" идентификаторы для использования в URL или именах файлов.
function createSlug(text) {
return text
.normalize("NFKD") // Нормализация Unicode
.replace(/[\u0300-\u036f]/g, "") // Удаление диакритических знаков
.replace(/\s+/g, "-") // Замена пробелов на дефисы
.toLowerCase(); // Преобразование в нижний регистр
}
console.log(createSlug("Crème Brûlée")); // Вывод: creme-brulee
4. Анализ текста
При анализе текста учет Unicode необходим для точных результатов.
const text = "😊😊😊";
const emoji = "😊";
const count = [...text].filter(char => char === emoji).length;
console.log(count); // Вывод: 3