2017-05-04 51 views
-1

我有2個字符串:我如何比較兩個字符串與口音

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

但是,當我對它們進行比較:

if(a == b) 

他們是不相等的。怎麼能使這個真實?

+0

如果我複製/粘貼我變得真正的'var a ='António',b ='António'; a == b',如果你不這樣做,那麼其中一個字符串有一個字符差異,這可能包括不可見的Unicode字符。請提供一個返回'false'的測試用例。 –

+0

雖然我在控制檯中檢查它顯示爲真 var a ='António',b ='António' console.log(a == b?true:false) –

+0

@NairAthul'(a == b)? true:false' ...來吧 - 你不能這樣做 – Weedoze

回答

-1

a == b對我而言是正確的。作爲一個側面說明,你應該使用===

-1

var a = "António"; 
 
var b = "António"; 
 

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

0

可以使用localeCompare()方法。

string_a.localeCompare(string_b);

/*預期收益:

0:精確匹配

-1:string_a < string_b

1:string_a> string_b

*/

0

你的問題,是因爲您的'ó'字符可能會有所不同。

您可以通過書面形式獲得同樣的字形:

  1. 使用Unicode字符

    var a = 'António'

  2. 使用Unicode代碼點

    var b = 'Ant\u00F3nio'

  3. 使用組合標誌( 'O' + ''')

    var c = 'Anto\u0301nio'

最後一個結合了 'O'(拉丁小字母O)與 '''(accute口音)。

現在如果你這樣做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()

因此這使得c來表示的一樣a

NFD(標準地分解形式)

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

因此這使得a來表示的相同c

或者你可以只依靠一個形式爲雙方並不在意用來表示任何字符串的格式:

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

注: JavaScript引擎使用UTF-16。這意味着如果您的角色在代碼點在U+0000U+FFFF之間的基本多語言平面中,您會很好。但是如果你在這個範圍之上使用了一些字符(Astral Planes),那麼這個字符將會使用代理對來表示,因此每個代碼單元都有16位。在這種情況下,如果字符串未標準化,某些操作可能不會產生預期的行爲。

注意:對於一個很好的閱讀,你可以檢查this