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
    
     */