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

JS String.prototype.localeCompare()

Запись от mr_dramm размещена 02.06.2025 в 18:46
Показов 5777 Комментарии 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 на форуме
 
Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru