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:与文化无关、不区分大小写的字符串比较的主要内容,如果未能解决你的问题,请参考以下文章