Форум программистов, компьютерный форум, киберфорум
mr_dramm
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  

JS String.prototype.localeCompare()

Запись от mr_dramm размещена 02.06.2025 в 18:46
Показов 5532 Комментарии 3
Метки javascript, unicode

скопировано из этой темы чтобы не потерялось.

localeCompare без указания локали для сравнения строк под капотом использует Intl.Collator , который работает согласно Unicode Collation Algorithm (UCA), согласно этому алгоритму происходит нормализация строк с учётом особенностей языка и символов или можно по другому сказать имитация алфовитного порядка, с использованием локали браузера или операционной системы (в зависимости от среды исполнения так как локаль не указана). Для нормализации учитываются веса:
- Первичный вес: Базовый символ (игнорирует диакритики)
- Вторичный вес: Диакритические знаки
- Третичный вес: Регистр букв
В localCompare можно указать дополнительную опцию sensitivity указать какие веса учитывать, по умолчанию учитываются все веса при сравнении.

Веса можно посмотреть в этом файле allkeys.txt
O
Code
1
004F  ; [.252C.0020.0008] # LATIN CAPITAL LETTER O
Ö

Code
1
00D6  ; [.252C.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER O WITH DIAERESIS
Z

Code
1
005A  ; [.2682.0020.0008] # LATIN CAPITAL LETTER Z
Из этого видно:
- O и Ö имеют одинаковый первичный вес 252C.
- Ö имеет дополнительный вторичный вес из-за умляута.
- Z имеет более высокий первичный вес 2682.
Поэтому:
JavaScript
1
console.log('Österreich'.localeCompare('Zealand')) // -1
Значит 'Österreich' идёт раньше 'Zealand' в сортировке по UCA.
А вот сравнение через > и < использует коды символов Unicode, без учёта локали и UCA, код символа который можно получить с помощью charCodeAt:

Code
1
2
3
"Ö".charCodeAt(); // 214 
"Z".charCodeAt(); // 90
console.log("Ö" > "Z"); // true
Метки javascript, unicode
Размещено в javascript, unicode
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 3
Комментарии
  1. Старый комментарий
    Аватар для voraa
    Чего то я ничего не нашел про то, как эти веса указывать и устанавливать. Может они и есть, но это внутренняя кухня функции и эти веса жестко заданы изначально для каждого языка.
    В разных языках буквы с акцентами и умляутами могут иметь "базовую" букву (например, в немецком для Ö базавая буква O, а в русском для Ё - базовая буква Е), а могут не иметь (например в шведском Ö и O - совершенно разные буквы)
    Свойство sensitivity задает как различать буквы, что учитывать.
    Значениями могут быть
    'base' - не различать буквы с акцентами, не различать большие и малые (Ё == Е, Е == е);
    'accent' - различать буквы с акцентами, не различать большие и малые (Ё != Е, Е == е);
    'case' - не различать буквы с акцентами, различать большие и малые (Ё == Е, Е != е);
    'variant' - все различать (Ё != Е, Е != е).

    При этом порядок букв определяется языком. Так, если различаются акценты, то в немецком Ö идет после O (но перед P), а в шведcком Ö всегда идет после Z

    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
    Кроме этого есть свойство caseFirst, определяющее, какие буквы большие или маленькие идут первыми.
    Значениями могу быть:
    '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 вне форума
  2. Старый комментарий
    Аватар для mr_dramm
    Цитата Сообщение от voraa
    Чего то я ничего не нашел про то, как эти веса указывать и устанавливать. Может они и есть, но это внутренняя кухня функции и эти веса жестко заданы изначально для каждого языка.
    Да веса "жестко" заданы и посмотреть их можно в этом файле allkeys.txt
    Запись от mr_dramm размещена 05.06.2025 в 11:29 mr_dramm вне форума
  3. Старый комментарий
    Аватар для voraa
    Но по этой таблице я не понимаю, почему в немецком 'Ö' идет после 'O' (это понять можно), но перед 'P', а в шведском 'Ö' идет после 'Z'? Где там ссылки на язык?
    Запись от voraa размещена 05.06.2025 в 12:05 voraa вне форума
 
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru