2017-10-16 41 views
17

Türkçe'de, i numaralı büyük harf olan İ numaralı bir mektup var. Küçük harfe dönüştürdüğümde tuhaf bir sonuç alırım. Örneğin:"İ" .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() fazladan bir karakter verir ve yanılmıyorsam eğer, bu COMBINING DOT ABOVE (U+0307) bu.

Bu karakterden nasıl kurtulurum?

Sadece dize filtre olabilir:

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

ama bunu doğru teslim ben? Daha çok tercih edilen bir yolu var mı? Dahası, bu ekstra karakter neden ilk sırada yer alıyor?

Bazı tutarsızlıklar var. Örneğin, Türkçe olarak, I: ı'un küçük bir şekli vardır. Aşağıdaki karşılaştırma

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

ise

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

döner false true döndürür Nasıl yani?

+7

Eğer 'String.toLocaleLowerCase()' denediniz mi? https://stackoverflow.com/questions/1850232/turkish-case-conversion-in-javascript –

+3

Buradan daha fazla bilgi alabilirsiniz: https://msdn.microsoft.com/en-us/library/ms973919.aspx# stringsinnet20_topic5 – JOSEFtw

+0

@JOSEFtw Merak ediyorum, JS niçin "" ı ".toUpperCase()' i doğru bir şekilde çevirir, fakat "İ" yi değil .toLowerCase() "'. – akinuri

cevap

32

Sen String#toLocaleLowerCase ile kullanılabilen bir Türk özgü vaka dönüşüm, gerekir:

let s = "İ"; 
 

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

+1

Dizenin yerel yerini bildiğim durumlarda yararlı olabilir mi? Örneğin, bir kullanıcı bir formdaki bir dizeyi girer, ancak dizenin yerel konumunu bilmeme imkanım yoktur. O zaman ne yapmalıyım? Sadece güvenli olmak için '.toLocaleLowerCase ('tr-TR')' nı kullanın. Bu durumda, her dizede '.toLocaleLowerCase ('tr-TR')' kullanmak güvenli midir? – akinuri

+9

@akinuri: Hayır, güvenli değil ('' 'i indirerek). Genel olarak doğru bir şekilde dönüştürmek için dizenin yerel değerini bilmelisiniz. Belirli durumlar için, geçici çözümler olabilir - bir dizgeyi küçültmenin sebebi nedir? – Ryan

+0

Şu anda hiç yok, ama geçmişte bunu birkaç kez yapmak zorundaydım. Düşünebildiğim biri, bir veritabanında sanatçı isimlerini (Türk ve yabancı) saklamaktı. PHP'yi kullanarak, doğru karakterleri elle haritalamak zorunda kaldım. – akinuri