web-dev-qa-db-ja.com

"İ" .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()は余分な文字を返します。私が間違っていなければ、それは 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:_ı_です。次の比較が真になる理由

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

ながら

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

falseを返しますか?

19
akinuri

String#toLocaleLowerCase で利用可能なトルコ固有の大文字小文字変換が必要になります。

let s = "İ";

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

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
0
Miran Shehu