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

时间:2013-08-21 14:05:58

标签: javascript string-comparison culture

如果之前已经提出过这个问题,请指出相关问题。

tl; dr:如何根据英语规则忽略套管,比较JavaScript中的两个字符串?

我的代码分析并比较来自两个不同来源的数据,每个来源对关键字是大写还是小写都有不同的看法,这意味着需要进行不区分大小写的比较。但是,如果在其他文化中使用(例如土耳其及其与字母I的臭名昭着的问题),我不希望系统中断。

JavaScript是否有任何方法可以进行与文化无关(读取:英语)不区分大小写的字符串比较?

3 个答案:

答案 0 :(得分:10)

  

如果在其他文化中使用(例如土耳其及其字母I中臭名昭着的问题),如何比较JavaScript中的两个字符串而不会破坏? JavaScript是否有任何方法可以进行与文化无关的不区分大小写的字符串比较?

是的,只需使用区域设置未受影响的standard .toLowerCase method 即可。 a.toLowerCase() == b.toLowerCase()完全没问题。 spec甚至要求:

  

必须根据Unicode字符数据库中的大小写映射派生结果

无论设置如何,这在所有系统中都是一致的。


为了尊重当前的语言环境,您可以明确使用.toLocaleLowerCase。 MDN声明:

  

在大多数情况下,这将产生与toLowerCase()相同的结果,但对于某些语言环境(例如土耳其语),其案例映射不遵循Unicode中的默认大小写映射,可能会有不同的结果。

然而,relying on locales does not seem to work well ...

答案 1 :(得分:2)

理论上有一种方法:String.localCompare()

问题在于大多数浏览器都没有正确实现它。

使用String.toLocaleLowerCase()可能会有更多运气。

示例:

if ("Äpfel".toLocaleLowerCase() == "äpfel".toLocaleLowerCase()) alert("Case Insensitive Match")

请注意以下内容不匹配(因为ä和a是不同的字符):

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

答案 2 :(得分:0)

您可以使用localeCompare但请注意,浏览器之间的实现方式不同。在Chrome / Firefox / IE11中似乎有用的是:

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

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);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="console">
</div>