JS String.prototype.localeCompare()
Показов 4999
Комментарии 3
Метки javascript, unicode
скопировано из этой темы чтобы не потерялось. localeCompare без указания локали для сравнения строк под капотом использует Intl.Collator , который работает согласно Unicode Collation Algorithm (UCA), согласно этому алгоритму происходит нормализация строк с учётом особенностей языка и символов или можно по другому сказать имитация алфовитного порядка, с использованием локали браузера или операционной системы (в зависимости от среды исполнения так как локаль не указана). Для нормализации учитываются веса: - Первичный вес: Базовый символ (игнорирует диакритики) - Вторичный вес: Диакритические знаки - Третичный вес: Регистр букв В localCompare можно указать дополнительную опцию sensitivity указать какие веса учитывать, по умолчанию учитываются все веса при сравнении. Веса можно посмотреть в этом файле allkeys.txt O
- O и Ö имеют одинаковый первичный вес 252C. - Ö имеет дополнительный вторичный вес из-за умляута. - Z имеет более высокий первичный вес 2682. Поэтому:
А вот сравнение через > и < использует коды символов Unicode, без учёта локали и UCA, код символа который можно получить с помощью charCodeAt:
|
Метки javascript, unicode
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 3
Комментарии
-
Чего то я ничего не нашел про то, как эти веса указывать и устанавливать. Может они и есть, но это внутренняя кухня функции и эти веса жестко заданы изначально для каждого языка.
В разных языках буквы с акцентами и умляутами могут иметь "базовую" букву (например, в немецком для Ö базавая буква O, а в русском для Ё - базовая буква Е), а могут не иметь (например в шведском Ö и O - совершенно разные буквы)
Свойство sensitivity задает как различать буквы, что учитывать.
Значениями могут быть
'base' - не различать буквы с акцентами, не различать большие и малые (Ё == Е, Е == е);
'accent' - различать буквы с акцентами, не различать большие и малые (Ё != Е, Е == е);
'case' - не различать буквы с акцентами, различать большие и малые (Ё == Е, Е != е);
'variant' - все различать (Ё != Е, Е != е).
При этом порядок букв определяется языком. Так, если различаются акценты, то в немецком Ö идет после O (но перед P), а в шведcком Ö всегда идет после Z
Кроме этого есть свойство caseFirst, определяющее, какие буквы большие или маленькие идут первыми.JavaScript 1 2 3 4 5 6 7 8 9
console.log('Ö'.localeCompare('O', 'de', {sensitivity: 'base'})); // 0 console.log('Ö'.localeCompare('P', 'de', {sensitivity: 'base'})); // -1 console.log('Ö'.localeCompare('O', 'de', {sensitivity: 'accent'})); // 1 console.log('Ö'.localeCompare('P', 'de', {sensitivity: 'accent'})); // -1 console.log('Ö'.localeCompare('O', 'sv', {sensitivity: 'base'})); // 1 console.log('Ö'.localeCompare('Z', 'sv', {sensitivity: 'base'})); // 1 console.log('Ö'.localeCompare('O', 'sv', {sensitivity: 'accent'})); // 1 console.log('Ö'.localeCompare('Z', 'sv', {sensitivity: 'accent'})); // 1
Значениями могу быть:
'false' (по умолчанию) - порядок определятся языком,
'upper' - первыми идут большие буквы,
'lower' - первыми идут маленькое буквы.
По умолчанию в большинстве языков принят порядок, что маленькие буквы идут перед большими, хотя по кодовым точкам юникода обычно наоборот.
JavaScript 1 2
console.log('Ц'.localeCompare('ц', 'ru')); // 1 console.log('Ц'.localeCompare('ц', 'ru', {caseFirst: 'upper'})); // -1
Запись от voraa размещена 03.06.2025 в 11:22
Обновил(-а) voraa 03.06.2025 в 21:52 -
Да веса "жестко" заданы и посмотреть их можно в этом файле allkeys.txtСообщение от voraa
Запись от mr_dramm размещена 05.06.2025 в 11:29
Обновил(-а) mr_dramm 05.06.2025 в 11:33 -
Запись от voraa размещена 05.06.2025 в 12:05