强制localeCompare区分大小写

时间:2016-01-18 18:14:45

标签: javascript string-comparison

我正在尝试使用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”相比而不是“a”有相反的结果吗?

1 个答案:

答案 0 :(得分:8)

LocalCompare可以是区分大小写的,由JSX或unicode扩展程序启用:{ sensitivity: 'case'}u-kf-upper

spec of LocalCompare 说:

  

结果用于按排序顺序排序字符串值   由系统默认语言环境

指定

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

对于区分大小写的订单,默认为en-US “lower”,其中包含:

u-kf-lower

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

aAbBcC ...

此测试显示从AaBbCc ... 切换到upper仅影响相同的字母,并且不会在小写之前对大写字母进行排序,反之亦然。

lower
  • 可能有一个区域设置以不同的方式对大写/小写进行排序,但我不知道任何...
  • 国际排序顺序不区分大小写
  • ASCII排序顺序为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
  • 某些区域设置有不同的顺序:芬兰语例如像W一样:ACb ...

区分大小写是否会以任何方式影响数值?

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

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

kn-true

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

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