2017-10-16 61 views
17

在土耳其語中,有一個字母İ,它是i的大寫形式。當我將它轉換成小寫字母時,我會得到一個奇怪的結果。例如:「İ」.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()返回多餘的字符,如果我沒有記錯,這是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ı。爲什麼下面的比較返回true

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

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

返回false?

+7

您是否嘗試過'String.toLocaleLowerCase()'? https://stackoverflow.com/questions/1850232/turkish-case-conversion-in-javascript –

+3

你可以閱讀更多關於這裏:https://msdn.microsoft.com/en-us/library/ms973919.aspx# stringsinnet20_topic5 – JOSEFtw

+0

@JOSEFtw我很好奇,爲什麼JS正確地轉換'「ı」.toUpperCase()',但不是'「İ」.toLowerCase()「'。 – akinuri

回答

32

你需要一個土耳其特有的大小寫轉換,可提供String#toLocaleLowerCase

let s = "İ"; 
 

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

+1

不是那樣嗎?在我知道字符串的語言環境的情況下有用嗎?例如,用戶在表單上輸入字符串,但我沒有辦法知道字符串的區域設置。那我該怎麼辦?無論如何,使用'.toLocaleLowerCase('tr-TR')',只是爲了安全?在這種情況下,對每個字符串使用'.toLocaleLowerCase('tr-TR')'是否安全? – akinuri

+9

@akinuri:不,它不安全(嘗試降低'I')。您必須知道字符串的區域設置才能正常轉換它。對於特定情況,可能會有解決方法 - 您爲什麼要降低字符串的理由? – Ryan

+0

目前,我沒有,但在過去,我不得不這樣做幾次。我能想到的一個就是將藝術家姓名(土耳其語和外國語)存儲在數據庫中。使用PHP,我必須手動映射正確的字符。 – akinuri

相關問題