强制区域设置比较区分大小写

Force localeCompare to be case-sensitive

本文关键字:大小写 比较区 设置 区域      更新时间:2023-09-26

我正在尝试使用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 以区分大小写的方式比较字符串,那么与"a"相比的"b"和与"a"相比的"B"不应该有相反的结果吗?

LocalCompare 可以区分大小写,由 { sensitivity: 'case'} 或 unicode 扩展名启用:u-kf-upperu-kf-lower

LocalCompare的规范说:

结果旨在按排序顺序对字符串值进行排序 由系统默认区域设置指定

或者可以添加为参数的区域设置。

区分大小写的顺序的 en-US 默认值"较低",如下所示:

aAbBcC ...

您可以将其更改为"上层",即:

AaBbCc ...

该测试表明,从upper切换到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
  • 有些语言环境有不同的顺序:例如芬兰语 像 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

使用选项或Unicode扩展名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