2016-06-13 65 views
3

JavaScript的toLowerCase()函數返回不同的字符串

console.log("HİNDİ".toLocaleLowerCase() == "hindi"); 
 
console.log("HİNDİ" == "hindi"); 
 

 
console.log("HİNDİ".toLowerCase()); 
 

 

 
console.log("HİNDİ".toLocaleLowerCase()) 
 
console.log("HİNDİ".toLowerCase())

我建立一個搜索功能,但我遇到的事情:

"HİNDİ".toLocaleLowerCase() // "hindi" 

"hindi" == "HİNDİ".toLocaleLowerCase() //false 

到底是什麼怎麼回事?

解決方案: @ pmrotule的答案似乎工作:

function to_lower(s) 
{ 
    var n = ""; 
    for (var i = 0; i < s.length; i++) // do it for one character at a time 
    { 
     var c = s[i].toLowerCase(); 

     // call replace() only if the character has a length > 1 
     // after toLowerCase() 
     n += c.length > 1 ? c[0].replace(/[^ -~]/g,'') : c; 
    } 
    return n; 
} 

感謝,

+0

不同編碼的字符串? Javascript在內部使用UTF-16。你可以在控制檯中運行''HİNDİ「.toLocaleLowerCase()'。此外,您可以嘗試直接鍵入字符代碼。例如:'「\ u90AB」' –

+0

這兩個UTF8,你也可以在控制檯上試試它在stackowerflow上。同樣的結果。 – serkan

+0

請確保在HTML文件的''部分有這樣的內容:「(HTML5)或HTML4:」'。 – trincot

回答

3

這是字符串格式的問題。 toLocaleLowerCase僅適用於人類可讀的顯示器。然而,仍然有一個竅門,你可以這樣做:

if ("hindi" == "HİNDİ".toLowerCase().replace(/[^ -~]/g,'')) 
{ 
    alert("It works!"); 
} 

編輯

如果你想讓它適用於所有的特殊字符:

function to_lower(s) 
 
{ 
 
    var n = ""; 
 
    for (var i = 0; i < s.length; i++) // do it for one character at a time 
 
    { 
 
     var c = s[i].toLowerCase(); 
 
     
 
     // call replace() only if the character has a length > 1 
 
     // after toLowerCase() 
 
     n += c.length > 1 ? c.replace(/[^ -~]/g,'') : c; 
 
    } 
 
    return n; 
 
} 
 

 
console.log("gök" == to_lower("GÖK")); 
 
console.log("hindi" == to_lower("HİNDİ")); 
 

 
function to_low(s) // shorter version 
 
{ 
 
    var n = ""; 
 
    for (var i = 0; i < s.length; i++) 
 
    { n += s[i].toLowerCase()[0]; } 
 

 
    return n; 
 
} 
 

 
console.log("hindi" == to_low("HİNDİ"));

+0

在這種情況下(「gök」==「GÖK」.toLowerCase()。替換(/ [^ - 〜/ g,''))返回false。 – serkan

+0

@ serdem420我編輯了我的答案,使其適用於所有特殊字符,如你的例子。 – pmrotule

+0

非常感謝! – serkan

3

的問題是,你的性格İ是由2個字符組成。

你有I,然後在頂部的'點'(UTF-8十進制代碼:775)。

試試這個:

"HİNDİ".toLocaleLowerCase().split('').map((_,v)=>console.log(_.charCodeAt(0)))

與此比較:

"hindi".toLocaleLowerCase().split('').map((_,v)=>console.log(_.charCodeAt(0)))

+0

感謝您的回答,這是有道理的。有什麼辦法可以爲這種情況產生「真實」? – serkan

+1

是的,有。但是,這不是一個好的解決方案。您可以刪除字符串中的每個變音符號並進行比較。 –