【问题标题】:How can I compare 2 strings with accents如何将 2 个字符串与重音符号进行比较
【发布时间】:2017-10-02 11:40:58
【问题描述】:

我有 2 个字符串:

var a = 'António'
var b = 'António'

但是当我比较它们时:

if(a == b)

他们不相等。怎样才能做到这一点?

【问题讨论】:

  • 如果我复制/粘贴 var 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

标签: javascript string compare


【解决方案1】:

a == b 为我返回 true。作为旁注,您可能应该使用===

【讨论】:

    【解决方案2】:

    var a = "António";
    var b = "António";
    
    $(document).ready(function(){
    	if(a == b){
      	alert(true);
      }else{
      	alert(false);
      }
    });
    <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>

    【讨论】:

      【解决方案3】:

      您可以使用String.prototype.localeCompare() 方法。

      stringA.localeCompare(stringB);
      
      /* Expected Returns:
      
       0:  exact match
      
      -1:  stringA < stringB
      
       1:  stringA > stringB
      
       */
      

      【讨论】:

        【解决方案4】:

        您的问题发生是因为您的'ó' 字符可能表达方式不同。

        你可以通过写作获得相同的字素:

        1. 使用 Unicode 字符

          var a = 'António'

        2. 使用 Unicode 代码点

          var b = 'Ant\u00F3nio'

        3. 使用组合标记 ('o' + '´')

          var c = 'Anto\u0301nio'

        最后一个结合了 'o'(拉丁小写字母 o)和 '´'(重音符号)。

        现在,如果您执行a === b,您将获得true。因为在这种情况下,我使用了 Unicode 字符并将其与它的代码点进行比较,这是同一件事。

        现在,如果您执行a === c,您将获得false。因为第一个是一个 Unicode 字符,第二个是把一个 Unicode 字符和一个组合标记组合起来,得到相同的字素。

        现在如果我在控制台中粘贴ac 输出,然后将它们复制粘贴到其他变量中并比较它们,我会得到相同的结果。

        做:var x = 'António'(来自a)和var y = 'António'(来自c)然后x === y将得到false。如果您在浏览器控制台中尝试此操作并得到 false,那么是正确的,否则 SO 可能已经处理了字符串,难怪其他人得到 true

        为了比较a ('António') 和c ('Anto\u0301nio'),您需要对表单进行规范化以获得相同的结果。

        因此你可以这样做:

        NFC(规范组合形式)(默认)

        a === c.normalize('NFC') 或只是a === c.normalize()

        因此这使得ca 表示相同。

        NFD(规范分解形式)

        a.normalize('NFD') === c

        因此,a 的表示方式与 c 相同。

        或者您可以只依赖一种形式,而不介意用于表示任何字符串的格式:

        a.normalize() === c.normalize()

        注意: JavaScript 引擎使用 UTF-16。这意味着,如果您的角色位于基本多语言位面,且代码点介于 U+0000U+FFFF 之间,您将会很好。但是,如果您使用超出该范围的某个字符(星界位面),那么该字符将使用代理对表示,因此每个代码单元有两个 16 位。在这种情况下,如果字符串未规范化,某些操作可能不会产生预期的行为。

        注意:您可以查看this

        【讨论】:

          猜你喜欢
          • 2011-06-26
          • 2011-12-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-10
          • 2014-10-07
          • 1970-01-01
          相关资源
          最近更新 更多