JavaScript:与文化无关的不区分大小写的字符串比较

JavaScript: Culture-independent case-insensitive string comparison

如果之前有人问过这个确切的问题,请指给我相关的问题。

tl;dr:根据英语规则,在忽略大小写的情况下,如何比较javascript中的两个字符串?

我的代码分析和比较来自两个不同来源的数据,每个来源对关键字应该是大写还是小写有不同的看法,这意味着需要进行不区分大小写的比较。但是,我不希望这个系统在其他文化中(比如土耳其,以及它在字母I上的臭名昭著的问题)被破坏。

javascript是否有任何方法来进行与区域性无关(阅读:英语)的不区分大小写的字符串比较?


How does one compare two strings in JavaScript without breaking if used in other cultures (such as Turkey and its notorious problems with the letter I)? Does JavaScript have any way of doing a culture-independent case-insensitive string comparison?

是的,只需使用不受区域设置影响的标准.toLowerCase方法。a.toLowerCase() == b.toLowerCase()非常好。规范甚至规定:

The result must be derived according to the case mappings in the Unicode character database

这在所有系统中都是一致的,不管它们的设置如何。

为了尊重当前的区域设置,您将显式地使用.toLocaleLowerCase。MDN状态:

In most cases, this will produce the same result as toLowerCase(), but for some locales, such as Turkish, whose case mappings do not follow the default case mappings in Unicode, there may be a different result.

然而,依靠当地环境似乎效果不佳…


理论上,有一种方法可以实现这一点:string.localcompare()。

问题是大多数浏览器没有正确地实现它。

使用string.toLocalLowercase()可能会更幸运。

例子:

1
if ("?pfel".toLocaleLowerCase() =="?pfel".toLocaleLowerCase()) alert("Case Insensitive Match")

注意以下内容不匹配(因为?A是不同的字符):

1
if ("?pfel".toLocaleLowerCase() =="apfel".toLocaleLowerCase()) alert("Case Insensitive Match")


您可以使用localeCompare,但请注意,它在浏览器之间的实现方式不同。在chrome/firefox/ie11中似乎可以工作的是:

1
first.localeCompare("First", navigator.language, { sensitivity:"base" }) === 0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var console = function() {
    var log = function(message) {
      strMessage ="<p>
"
+ message +"
</p>"
;
      $("#console").append(strMessage);
    };
   
    return {
        log: log
    };
}()

var first ="first";
var result = first.localeCompare("First", navigator.language, { sensitivity:"base" }) === 0;
console.log(result);
1
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">