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

aki*_*uri 19 javascript case-sensitive uppercase

在土耳其语中,有一个字母?是大写的形式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
Run Code Online (Sandbox Code Playgroud)

"?".toLowerCase()返回一个额外的字符,如果我没有弄错的话,它就是上面的组合点(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(""));
Run Code Online (Sandbox Code Playgroud)

但我正确地处理了这个吗?有更好的方法吗?此外,为什么这个额外的角色首先出现?

有些不一致.例如,在土耳其语中,有一种小写形式I:?.为什么以下比较返回true

console.log( "?".toUpperCase() == "i".toUpperCase() ) // true
Run Code Online (Sandbox Code Playgroud)

console.log( "?".toLowerCase() == "i" ) // false
Run Code Online (Sandbox Code Playgroud)

返回false?

Ry-*_*Ry- 32

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

let s = "?";

console.log(s.toLowerCase().length);
console.log(s.toLocaleLowerCase('tr-TR').length);
Run Code Online (Sandbox Code Playgroud)

  • @akinuri:不,这不安全(尝试降低'I`).您必须知道字符串的语言环境才能正常转换它.对于特定情况,可能会有解决方法 - 您为小写字符串的原因是什么? (9认同)
  • @akinuri因为[没有办法进行通用案例映射](https://blogs.msdn.microsoft.com/oldnewthing/20030905-00/?p=42643)所以你必须知道是哪种语言.与[排序](https://docs.microsoft.com/en-us/globalization/locale/sorting-and-string-comparison)相同,因为相同的字符串可以排序为[不同的顺序](http:// www .unicode.org/reports/tr10 /#简介)用不同的语言 (6认同)
  • @akinuri:艺术家的名字?你需要小写那些,还是一个不区分大小写的比较就足够了?但是,语言是一个非常棘手的问题. (2认同)
  • @Ryan不区分大小写的比较还需要指定语言环境吗? (2认同)