Устранение акцентов/диакритических знаков в JS для IE6
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Если требуется избавиться от акцентов в строке, значит, вам поможет функция normalize
в JavaScript. Сначала примените normalize('NFD')
, которая разделит каждый символ на основной символ и отдельный акцент, а затем используйте метод replace
с регулярным выражением для удаления диакритических знаков.
Пример:
const removeAccents = str => str.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
console.log(removeAccents('àéîöú')); // "aeiou" в приватном режиме
Здесь ключом к разгадке является использование normalize('NFD')
, которое разбивает символы на составные части, а регулярное выражение /[\u0300-\u036f]/g
удаляет акценты.
Детальное разъяснение и альтернативы
Поддержка старых версий браузера, например, IE6
Для обеспечения совместимости со старыми браузерами, такими как IE6, не поддерживающими метод normalize
, можно создать карту соответствия между символами с акцентами и их базовыми версиями:
const accentsMap = new Map([['á', 'a'], /* и так далее */ ]);
const removeAccentsFallback = (str) => {
// Версия кода для работы в браузерах, не поддерживающих метод normalize
return str.split('').map(char => accentsMap.get(char) || char).join('');
};
Влияние диакритических знаков на порядок сортировки
Акценты могут повлиять на последовательность сортировки строк. Для корректной сортировки без учета акцентов, можно использовать Intl.Collator
:
const strings = ['apple', 'àpple', 'banana'];
strings.sort(new Intl.Collator('en', { sensitivity: 'base' }).compare);
Повышение производительности
Если требуется ускорить выполнение кода и сделать его более эффективным, вы можете использовать свойство Unicode \p{M}
в регулярных выражениях:
const removeAccents = str => str.normalize('NFD').replace(/\p{M}/gu, '');
// В результате все акценты из строки исчезнут!
Для еще большего ускорения рассмотрите возможность использования конструкторов строк вместо регулярных выражений.
Диакритики и специальные символы
Столкнувшись с такими символами как œ
и œ̀
, стоит обязательно включить их в карту диакритиков для надежного решения всей задачи.
Проверка на соответствие латинице
Чтобы убедиться, что строки составлены только из латинских символов, можно воспользоваться библиотеками, такими как Latinise
:
if (latinise(str).length === str.length) {
// Строка полностью латинизирована
}
Когда в работу вступает lodash
Если в вашем проекте уже используется lodash
, то можно воспользоваться функцией _.deburr()
, поддерживающей IE6 и упрощающей удаление диакритиков.
Внимание к лицензиям
Перед использованием или модификацией любых внешних решений для удаления диакритиков, проверьте, что они соответствуют лицензионным требованиям, например, Apache License, Version 2.0.
Визуализация
Вообразите себе строку как яркий шествие символов, каждый из которых украшен акцентом:
Яркое шествие символов: [â, é, i̗, õ, ú]
Чтобы нормализовать эти символы, нам нужно откупорить все изящные украшения, облегчив их до базового вида:
normalizedText = originalText.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
Этот процесс можно сравнить с введением строгого дресс-кода на вечеринке:
Приводим к общему знаменателю: [â → a, é → e, ï → i, õ → o, ú → u]
В итоге получаем минималистичный и чистый стиль:
Готовое к шествию: [a, e, i, o, u]
Теперь символы, представленные в простых и понятных формах, будут отвечать любым вызовам в мире кода.
Учет лигатур и специальных символов
Тщательно подобранная функция отображения умело справится со специальными символами и лигатурами.
Взвешенное применение lodash
Если весь функционал lodash вам кажется избыточным, примените lodash.deburr
как отдельный npm-пакет, тем самым сокращая размер вашего проекта.
Погружение в тему
Предложенные рекомендации помогут глубже понять процесс удаления диакритических знаков, включая ссылки на полифилл для Intl.Collator
и протестированные решения, например, от @skerit, обеспечивающие стабильную производительность.
Полезные материалы
- String.prototype.normalize() – JavaScript | MDN
- Remove accents/diacritics in a string in JavaScript – Stack Overflow
- Unicode equivalence – Wikipedia
- ECMAScript 2015 Language Specification – ECMA-262 6th Edition
- unorm – npm
- UAX #44: Unicode Character Database
- Unicode character class escape: \p{...}, \P{...} – JavaScript | MDN
Завершение
Теперь, когда мы достигли максимальной "производительности" в наших решениях, пора активировать наш остро отточенный код. Пусть наши сессии кодирования пройдут на ура, а акценты строк останутся лишь сладкими воспоминаниями!