2016-03-08 44 views
12

以下給出了Firefox中的0。然而它在鉻中給出-1。Chrome與Firefox中的ToLowerCase

var index = "İSTANBUL".toLowerCase().indexOf("is"); 
console.log(index); 

https://jsfiddle.net/81f0yr8w/1/

鉻提出一個多餘的字符時下殼體İ(拉丁大寫字母i上面 「\ u0130」 點)

"İ".toLocaleLowerCase().length 
>2 

它是一個正常的行爲?

+1

確實發生了一些奇怪的事情。在Chrome中:'「İSTANBUL」.length === 8'和'「İSTANBUL」.toLowerCase()。length === 9'。它增加了一個隱藏的角色。 – Halcyon

+4

「İSTANBUL」.toLowerCase()。charCodeAt(1)=== 775但「İ」和「i」是兩個非常不同的字符。第一個在低位時有一個合併點。 (http://www.fileformat.info/info/unicode/char/0307/index.htm) –

回答

3

您可以先對字符串進行編碼,然後進行比較。這會在Firefox和Chrome中產生相同的結果。

// 0 Chrome // 0 Firefox 
encodeURIComponent("İSTANBUL".toLowerCase()).indexOf(encodeURIComponent("İS".toLowerCase())) 

Firefox和Chrome處理它的事實是不同的,這很奇怪。但是奇怪的是由w3c規範在這裏定義:https://www.w3.org/TR/charmod-norm/#matchingAlgorithm fwiw,你必須先將字符串小寫,然後對其進行編碼。他們不會匹配,除非他們先是相同的情況。

找到Firefox Bug並標記爲[812837]的副本。 (https://bugzilla.mozilla.org/show_bug.cgi?id=812837)據報道在2011年,它仍然是開放的。所以我想這不是一個優先事項。

+0

「İSTANBUL」.toLowerCase()。indexOf(「İS」.toLowerCase())也給我零。有沒有需要一個encodeUriComponent,我需要添加額外的替代品,在我的實際代碼中,像替換İ與我:)但這種情況是奇怪的不是... – cgon

+0

是的,尼斯發現順便說一句 – Shanimal