"İ".toLowerCase() != "i"

"İ".toLowerCase() != "i"

在土耳其语中,有一个字母 İ,它是 i 的大写形式。当我将它转换为小写时,我得到了一个奇怪的结果。例如:

var string_tr = "İ".toLowerCase();
var string_en = "i";

console.log( string_tr == string_en );  // false
console.log( string_tr.split("") );     // ["i", "̇"]
console.log( string_tr.charCodeAt(1) ); // 775
console.log( string_en.charCodeAt(0) ); // 105

"İ".toLowerCase() returns多了一个字符,如果没记错的话是COMBINING DOT ABOVE (U+0307).

如何去掉这个字符?

我可以过滤字符串:

var string_tr = "İ".toLowerCase();

string_tr = string_tr.split("").filter(function (item) {
    if (item.charCodeAt(0) != 775) {
        return true;
    }
}).join("");

console.log(string_tr.split(""));

但是我处理得对吗?有没有更好的方法?此外,为什么这个额外的字符会出现在第一位?

有些不一致。例如,在土耳其语中,有 I 的小写形式:ı。为什么下面的比较returns为真

console.log( "ı".toUpperCase() == "i".toUpperCase() ) // true

同时

console.log( "İ".toLowerCase() == "i" ) // false

returns假的?

您需要土耳其语特定的大小写转换,可用于 String#toLocaleLowerCase:

let s = "İ";

console.log(s.toLowerCase().length);
console.log(s.toLocaleLowerCase('tr-TR').length);

您可以只对语言使用 LocalLowerCase 或 LocalUpperCase 像土耳其语和其他字母 点和无点 i 版本,如阿塞拜疆语、哈萨克语、鞑靼语和克里米亚鞑靼语。

var string_tr = "İ".toLocalLowerCase();
var string_en = "i";

console.log( string_tr == string_en );  // false
console.log( string_tr.split("") );     // ["i", "̇"]
console.log( string_tr.charCodeAt(1) ); // 775
console.log( string_en.charCodeAt(0) ); // 105