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

JS String.prototype.localeCompare()

Запись от mr_dramm размещена 02.06.2025 в 18:46. Обновил(-а) mr_dramm 02.06.2025 в 18:48
Показов 4999 Комментарии 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 на форуме
    Обновил(-а) voraa 03.06.2025 в 21:52
  2. Старый комментарий
    Аватар для mr_dramm
    Цитата Сообщение от voraa
    Чего то я ничего не нашел про то, как эти веса указывать и устанавливать. Может они и есть, но это внутренняя кухня функции и эти веса жестко заданы изначально для каждого языка.
    Да веса "жестко" заданы и посмотреть их можно в этом файле allkeys.txt
    Запись от mr_dramm размещена 05.06.2025 в 11:29 mr_dramm вне форума
    Обновил(-а) mr_dramm 05.06.2025 в 11:33
  3. Старый комментарий
    Аватар для voraa
    Но по этой таблице я не понимаю, почему в немецком 'Ö' идет после 'O' (это понять можно), но перед 'P', а в шведском 'Ö' идет после 'Z'? Где там ссылки на язык?
    Запись от voraa размещена 05.06.2025 в 12:05 voraa на форуме
 
Новые блоги и статьи
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг. Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя. Странные серые краски проникают и. . .
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
Dispose и Finalize в C#
stackOverflow 12.06.2025
Работая с C# больше десяти лет, я снова и снова наблюдаю одну и ту же историю: разработчики наивно полагаются на сборщик мусора, как на волшебную палочку, которая решит все проблемы с памятью. Да,. . .
Повышаем производительность игры на Unity 6 с GPU Resident Drawer
GameUnited 11.06.2025
Недавно копался в новых фичах Unity 6 и наткнулся на GPU Resident Drawer - штуку, которая заставила меня присвистнуть от удивления. По сути, это внутренний механизм рендеринга, который автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »