Заставить localeCompare учитывать регистр

Я пытаюсь использовать JavaScript методом localecompare функция сортировки строк.

Я был удивлен результатами выполнения следующих строк в консоли devTools:

"a".localeCompare("b") // returns: -1
"A".localeCompare("b") // returns: -1

еще один тест:

"b".localeCompare("a") // returns: 1
"B".localeCompare("a") // returns: 1

даже когда я более конкретен в своем роде, я получаю тот же результат:

"a".localeCompare("b", { usage: "sort", sensitivity: 'variant' }) // -1
"A".localeCompare("b", { usage: "sort", sensitivity: 'variant' }) // -1
"b".localeCompare("a", { usage: "sort", sensitivity: 'variant' }) // 1
"B".localeCompare("a", { usage: "sort", sensitivity: 'variant' }) // 1

Я хочу использовать localeCompare для сравнения строк в регистр путь, поэтому не должно" b " по сравнению с "a" и " B" по сравнению с "а" имеют противоположные результаты?

1 ответов


LocalCompare может быть дело-Сенситив, включена { sensitivity: 'case'} или расширение unicode:u-kf-upper или u-kf-lower.

на спецификации LocalCompare говорит, что:

результат предназначен для упорядочивания строковых значений в порядке сортировки задается системной локалью по умолчанию

или локаль, которую вы можете добавить в качестве аргумента.

на по умолчанию для en-US по регистру заказ "Нижнем" С:

aAbBcC ...

вы можете изменить его на "верхний", которая составляет:

AaBbCc ...

этот тест показывает, что переключение с upper to lower влияет только на ту же букву и не сортирует прописные буквы перед строчными или наоборот.

var b = "A".localeCompare("a", 'en-US-u-kf-lower'); //  1
var c = "A".localeCompare("a", 'en-US-u-kf-upper'); // -1
var d = "A".localeCompare("b", 'en-US-u-kf-upper'); // -1
var e = "A".localeCompare("b", 'en-US-u-kf-lower'); // -1

  • может быть локаль, которая сортирует верхний / нижний регистр по-разному, но я не знаю ни одного...
  • в международный порядок сортировки нечувствителен к регистру
  • порядок сортировки ASCII будет ACb
  • некоторые локали имеют разные порядки: финский, например, протекторы V, такие как W:Va Wb Vc ...

влияет ли чувствительность к регистру на числовые значения каким-либо образом?

var b = "1".localeCompare("a", 'en-US-u-kf-lower'); //  -1
var c = "1".localeCompare("A", 'en-US-u-kf-upper'); // -1
var d = "104".localeCompare("a", 'en-US-u-kf-upper'); // -1

нет, но ...

есть опция, как можно сравнивать числовые значения:kn

с параметром или Расширение Юникода kn можно включить числовое сравнение (kn-true):

var b = "10".localeCompare("2", 'en-US-u-kn-true'); // 1
var c = "10".localeCompare("2", 'en-US'); // -1

Однако, цифры всегда перед буквами:

var d = "1".localeCompare("a", 'en-US-u-kn-true'); // -1
var e = "1".localeCompare("a", 'en-US'); // -1