2017-10-16 38 views
17

W języku tureckim znajduje się litera İ, która jest wielką postacią z i. Po konwersji na małe litery otrzymuję dziwny wynik. Na przykład:"İ" .toLowerCase()! = "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() zwraca dodatkowy znak, a jeśli się nie mylę, to COMBINING DOT ABOVE (U+0307).

Jak mogę się pozbyć tej postaci?

może po prostu filtrować ciągu:

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(""));

ale ja wręczając to prawidłowo? Czy istnieje bardziej preferowany sposób? Co więcej, dlaczego ta dodatkowa postać pojawia się w pierwszej kolejności?

Istnieje pewna niekonsekwencja. Na przykład w języku tureckim istnieje mała forma I: ı. Jak to następujące porównanie zwraca true

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

podczas

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

zwraca fałsz?

+7

próbowałeś 'String.toLocaleLowerCase()'? https://stackoverflow.com/questions/1850232/turkish-case-conversion-in-javascript –

+3

Możesz przeczytać więcej na ten temat tutaj: https://msdn.microsoft.com/en-us/library/ms973919.aspx# stringsinnet20_topic5 – JOSEFtw

+0

@JOSEFtw Jestem ciekawy, dlaczego JS konwertuje '" ı ".toUpperCase()' poprawnie, ale nie '" totoLowerCase() ". – akinuri

Odpowiedz

32

Musisz turecką specyficzny konwersję przypadku dostępne z String#toLocaleLowerCase:

let s = "İ"; 
 

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

+1

Czy nie tylko to być przydatnym w sytuacjach, w których znam lokalizację ciągu? Na przykład użytkownik wprowadza ciąg znaków w formularzu, ale nie mam sposobu na określenie ustawień narodowych ciągu znaków. Więc co powinienem zrobić? Używaj '.toLocaleLowerCase ('tr-TR')' tak czy inaczej, po prostu być bezpieczne? W takim przypadku, czy można bezpiecznie używać '.toLocaleLowerCase ('tr-TR')' na każdym łańcuchu? – akinuri

+9

@akinuri: Nie, to nie jest bezpieczne (spróbuj obniżyć "I"). Musisz znać ustawienia narodowe ciągu, aby ogólnie go poprawnie przekształcić. W określonych sytuacjach mogą istnieć obejścia - jaki jest twój powód obniżenia ciągu znaków? – Ryan

+0

Obecnie nie mam, ale w przeszłości musiałem to zrobić kilka razy. Mogłem myśleć o przechowywaniu nazwisk artystów (tureckich i zagranicznych) w bazie danych. Używając PHP, musiałem ręcznie mapować właściwe znaki. – akinuri