强制localeCompare区分大小写

Jon*_*ink 12 javascript string-comparison

我正在尝试使用JavaScript的localeCompare函数来排序字符串.

我对devTools控制台中运行以下行的结果感到惊讶:

"a".localeCompare("b") // returns: -1
"A".localeCompare("b") // returns: -1
Run Code Online (Sandbox Code Playgroud)

另一个测试:

"b".localeCompare("a") // returns: 1
"B".localeCompare("a") // returns: 1
Run Code Online (Sandbox Code Playgroud)

即使我对我的排序更具体,我也会得到相同的结果:

"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
Run Code Online (Sandbox Code Playgroud)

我想使用localeCompare以区分大小写的方式比较字符串,所以不应该"b"与"a"和"B"相比,"a"与"a"相比具有相反的结果吗?

jHi*_*her 10

LocalCompare可以是case-sensitiv,由{ sensitivity: 'case'}unicode扩展名启用:u-kf-upper或u-kf-lower.

LocalCompare的规范说:

结果旨在按系统缺省语言环境指定的排序顺序对String值进行排序

或者您可以添加为参数的语言环境.

在为EN-美国违约的情况下,敏感的顺序是"低"有:

aAbBcC ...
Run Code Online (Sandbox Code Playgroud)

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

AaBbCc ...
Run Code Online (Sandbox Code Playgroud)

此测试显示从切换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
Run Code Online (Sandbox Code Playgroud)
  • 可能有一个区域设置不同地排序大写/小写,但我不知道任何...
  • 国际排序顺序不区分大小写
  • ASCII排序顺序 ACb
  • 一些语言环境有不同的顺序:芬兰语例如像W一样踏向V: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
Run Code Online (Sandbox Code Playgroud)

不是,但 ...

有一个选项,如何比较数值: kn

使用选项或Unicode扩展,kn可以启用数字比较(kn-true):

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

但是,数字总是在字母之前:

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