2016-06-13 66 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

是的,有。但是,这不是一个好的解决方案。您可以删除字符串中的每个变音符号并进行比较。 –