【问题标题】:"İ".toLowerCase() != "i""İ".toLowerCase() != "i"
【发布时间】:2018-03-27 23:49:35
【问题描述】:

在土耳其语中,有一个字母İ,它是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

返回假?

【问题讨论】:

  • 你试过String.toLocaleLowerCase()吗? stackoverflow.com/questions/1850232/…
  • 您可以在这里阅读更多相关信息:msdn.microsoft.com/en-us/library/…
  • @JOSEFtw 我很好奇,为什么 JS 能正确转换 "ı".toUpperCase(),但不能正确转换 "İ".toLowerCase()"
  • @akinuri,因为ı (U+0131)i (U+0069) 的映射相同:I (U+0049)
  • @akinuri,它会为依赖这种行为的人破解一些代码。老实说,这并不是那么荒谬......在任何时候,这就是为什么 Unicode 为土耳其语添加了特殊的大小写。这就是为什么你需要使用.toLocaleLowerCase

标签: javascript case-sensitive uppercase


【解决方案1】:

您需要土耳其语特定的大小写转换,可通过 String#toLocaleLowerCase 获得:

let s = "İ";

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

【讨论】:

  • 这不是只有在我知道字符串的语言环境的情况下才有用吗?例如,用户在表单上输入了一个字符串,但我无法知道该字符串的语言环境。那我该怎么办?无论如何都要使用.toLocaleLowerCase('tr-TR'),只是为了安全?在这种情况下,在每个字符串上使用.toLocaleLowerCase('tr-TR') 是否安全?
  • @akinuri:不,这不安全(尝试小写I)。通常,您必须知道字符串的语言环境才能正确转换它。对于特定情况,可能会有解决方法——您将字符串小写的原因是什么?
  • @akinuri 因为there's no way to do universal case mapping 所以你必须知道那是哪种语言。与sorting 相同,因为相同的字符串可能以不同的语言排序为different orders
  • @akinuri:艺术家的名字?您是否需要将它们小写,或者不区分大小写的比较就足够了?但是,是的,语言是那些极其棘手的问题之一。
  • @Ryan 不区分大小写的比较是否也需要指定语言环境?
【解决方案2】:

您可以只使用 LocalLowerCase 或 LocalUpperCase 语言 像土耳其语和其他字母一样 dotted 和 dotless 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

【讨论】:

    猜你喜欢
    • 2018-05-21
    • 1970-01-01
    • 2011-10-31
    • 2017-10-23
    • 2014-02-22
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多