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

Posted

技术标签:

【中文标题】JavaScript:与文化无关、不区分大小写的字符串比较【英文标题】:JavaScript: Culture-independent case-insensitive string comparison 【发布时间】:2013-08-21 14:05:58 【问题描述】:

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

tl;dr:如何在 javascript 中比较两个字符串,同时根据 English 规则忽略大小写?

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

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

【问题讨论】:

您的意思是,您只想比较不区分大小写的 A-Z/a-z 和其他区分大小写的内容?为什么说“按照英语规则”是“文化无关的”? 听起来理论上是不可能的。您想如何以“与文化无关”、不区分大小写的方式比较德语 ß?或者两者都是法语,其中重音字母的大写版本失去了口音,而语言则没有。我认为,大小写的整个概念取决于语言。 @Bergi @RemcoGerlich:也许我选择的术语很糟糕。通过“文化独立”,我并不是说英语是一种“中立”的文化。相反,我要求的是一种以不区分大小写的方式比较两个字符串的方式,这种方式在不同区域设置的计算机之间保持一致。例如,我想确保在世界上的每台计算机上,EXIT 都被视为等于 exit,包括设置为土耳其语且字母 I 的大写规则不同的计算机。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

使用String.toLocaleLowerCase(),您可能会更幸运。

例子:

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

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于JavaScript:与文化无关、不区分大小写的字符串比较的主要内容,如果未能解决你的问题,请参考以下文章

javascript过滤关键词不区分大小写字母的问题

Javascript匹配-不区分大小写[重复]

JavaScript中不区分大小写的字符串替换?

不区分大小写地访问 JavaScript 属性?

javascript比较字符串而不区分大小写[重复]

HTML表格的JavaScript不区分大小写排序