Javascript 如何比较2个带重音的字符串
我有两个字符串:Javascript 如何比较2个带重音的字符串,javascript,string,compare,Javascript,String,Compare,我有两个字符串: var a = 'António' var b = 'António' 但当我比较它们时: if(a == b) 他们不平等。a如何才能使之成为真的呢?a==b为我返回真的。作为旁注,您可能应该使用== var a=“António”; var b=“António”; $(文档).ready(函数(){ 如果(a==b){ 警惕(正确); }否则{ 警报(假); } }); 您可以使用该方法 stringA.localeCompare(stringB); /*预期回报:
var a = 'António'
var b = 'António'
但当我比较它们时:
if(a == b)
他们不平等。a如何才能使之成为真的呢?
a==b
为我返回真的。作为旁注,您可能应该使用==
var a=“António”;
var b=“António”;
$(文档).ready(函数(){
如果(a==b){
警惕(正确);
}否则{
警报(假);
}
});代码>
您可以使用该方法
stringA.localeCompare(stringB);
/*预期回报:
0:完全匹配
-1:stringAstringB
*/
您的问题之所以发生,是因为您的字符的表达方式可能不同
您可以通过以下方式获得相同的grapheme:
使用Unicode字符
var a='antoónio'
使用Unicode代码点
var b='Ant\u00F3nio'
使用组合标记('o'+''''''))
var c='Anto\u0301nio'
最后一个字母将“o”(拉丁文小写字母o)与“o”(accute重音)组合在一起
现在,如果您执行a===b
,您将得到true
。因为在本例中,我使用了Unicode字符,并将其与相同的代码点进行了比较
现在,如果您执行a===c
,您将得到false
。因为第一个是一个Unicode字符,第二个是将一个Unicode字符与一个组合标记相结合,从而获得相同的字形
现在,如果我在控制台中粘贴a
和c
输出,然后将它们复制粘贴到其他变量中并进行比较,我将得到相同的结果
执行:var x='António'
(来自a
)和var y='António'
(来自c
)然后x==y
将得到false
。如果您在浏览器控制台中尝试此操作并得到false
,则是正确的,否则SO可能已处理该字符串,难怪其他人得到true
为了比较a
('Antoónio'
)和c
('Anto\u0301nio'
),您需要对表单进行规范化,以获得相同的结果
因此,您可以:
NFC(标准组合形式)(默认值)
a==c.normalize('NFC')
或只是a==c.normalize()
因此,这使得c
的表示方式与a
相同
NFD(标准分解形式)
a.normalize('NFD')==c
因此,这使得a
的表示方式与c
相同
或者,您可以只使用一种形式表示两个字符串,而不介意用于表示任何字符串的格式:
a.normalize()==c.normalize()
注意:JavaScript引擎使用UTF-16。这意味着,如果您的角色处于基本的多语言平面中,代码点介于U+0000
和U+FFFF
之间,那么您就很好了。但是,如果您使用该范围(星体平面)之上的某个字符,那么该字符将使用代理项对来表示,因此每个代理项对具有两个16位的代码单元。在这种情况下,如果字符串未规范化,某些操作可能不会产生预期的行为
注意:如果我复制/粘贴变量a='António',b='António',我得到的值是真的,你可以仔细阅读。如果我复制/粘贴变量a='António',b='Ant nio';a==b
如果您没有,则其中一个字符串具有字符差异,这可能包括不可见的unicode字符。请提供一个返回false
的测试用例。当我在控制台中检查它时,它会显示true var a='António',b='António'console.log(a==b?true:false)@NairAthul(a==b)?true:false
…拜托-你不能在控制台中尝试它。它将给你结果:)(a==b)已经返回true | false
stringA.localeCompare(stringB);
/* Expected Returns:
0: exact match
-1: stringA < stringB
1: stringA > stringB
*/