首页 文章

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

提问于
浏览
9

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

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

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

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

3 回答

  • 9

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

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

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

    例:

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

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

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

    您可以使用 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>
    
  • 0

    如果在其他文化中使用(例如土耳其及其字母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 ......

相关问题