我有2个字符串:
var a = 'António'
var b = 'António'
但是,当我比较它们时:
if(a == b)
它们不等。一个人如何做到这一点?
您的问题发生了,因为您的'ó'
字符可能会有所不同。
您可以通过写作获得相同的石墨:
-
使用Unicode字符
var a = 'António'
-
使用Unicode代码点
var b = 'Antu00F3nio'
-
使用组合标记('o' '´'(
var c = 'Antou0301nio'
最后一个将'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
,那么这是对的,否则可能已经处理了字符串,难怪其他人会得到true
。
为了将a
('António'
(与c
('Antou0301nio'
(进行比较,您需要标准化表单才能获得相同的东西。
因此,您可以做:
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位。在这种情况下
注意:为了进行良好的阅读,您可以检查一下。
您可以使用String.prototype.localeCompare()
方法。
stringA.localeCompare(stringB);
/* Expected Returns:
0: exact match
-1: stringA < stringB
1: stringA > stringB
*/
a == b
对我返回。作为旁注,您可能应该使用===
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>