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

JS String.prototype.localeCompare()

Запись от mr_dramm размещена 02.06.2025 в 18:46
Показов 5784 Комментарии 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 вне форума
 
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
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 (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru