JavaScript中的土耳其语大小写转换

41

我希望能够在JavaScript中将字符串转换为所需的大小写和语言环境。我认为像toUpperCase()toLocaleUpperCase()这样的标准函数不能满足这种需求。而toLocale函数的行为也不符合预期。

例如,在我的系统上,Safari 4、Chrome 4 Beta和Firefox 3.5.x将带有土耳其字符的字符串转换错误。这些浏览器响应navigator.language分别为"en-US""tr""en-US"。但是据我所知,没有办法获取用户在浏览器中设置的Accept-Lang值。尽管我已经在每个浏览器中都配置了土耳其区域设置,只有Chrome给出了"tr"。我认为这些设置仅影响HTTP头,但我们无法通过JavaScript访问这些设置。

Mozilla文档中,它说:

字符串内部的字符会根据当前语言环境进行转换…(大多数语言情况下)这将返回与...相同的结果。

我认为对于土耳其语来说,无论配置为en还是tr,都是有效的。在土耳其语中,它应该将"DİNÇ"转换为"dinç",将"DINÇ"转换为"dınç"或反之亦然。

是否有任何JavaScript库可以满足这种需求?我认为它不仅应该正确地根据用户的语言环境进行转换,而且还应支持通过语言环境参数进行转换。因为开发人员无法访问用户配置的首选语言。


你可能会对以下潜在的新SE网站提案感兴趣,包括土耳其语言和用法土耳其语的StackOverflow - Caleb
5个回答

106

多年后回到这里,提供更加最新的解决方案。

下面的hack已经不再需要,

只需使用String.toLocaleUpperCase()String.toLocaleLowerCase()即可。

"dinç".toLocaleUpperCase('tr-TR') // "DİNÇ"

现在所有的主流浏览器都支持这个特性。


[ 已过时,请勿使用 ]

尝试使用以下函数

String.prototype.turkishToUpper = function(){
    var string = this;
    var letters = { "i": "İ", "ş": "Ş", "ğ": "Ğ", "ü": "Ü", "ö": "Ö", "ç": "Ç", "ı": "I" };
    string = string.replace(/(([iışğüçö]))+/g, function(letter){ return letters[letter]; })
    return string.toUpperCase();
}

String.prototype.turkishToLower = function(){
    var string = this;
    var letters = { "İ": "i", "I": "ı", "Ş": "ş", "Ğ": "ğ", "Ü": "ü", "Ö": "ö", "Ç": "ç" };
    string = string.replace(/(([İIŞĞÜÇÖ]))+/g, function(letter){ return letters[letter]; })
    return string.toLowerCase();
}

// Example
"DİNÇ".turkishToLower(); // => dinç
"DINÇ".turkishToLower(); // => dınç

我希望它们能为你工作。


1
我在我的项目中使用了类似这样的代码: <code> turkishToUpper = function(str) { return str.replace('i','İ').replace('ı','I').toUpperCase(); } </code> 因为只有'i'和'I'字符是问题所在。但我不知道其他语言中是否存在其他问题,你可能需要针对特定语言进行大小写转换。因此应该有一个接受区域设置参数的库,但我找不到一个。 感谢您的答案,它也解决了土耳其语的问题。 - sanilunlu
3
我认为第二个答案更好。因为如果两个或更多的字符相邻,这个答案不会降低它们的数量。 - spinodal
2
toTurkishUpper和toTurkishLower更易于理解。 - hakan
请使用...replace(/i|ı|ş|ğ|ü|ç|ö/gi,...)替换给定的正则表达式,因为该正则表达式存在问题。如果单词中有连续的土耳其字符,例如单词“girişim”,那么它会尝试从数组中查找“işi”,但实际上返回的是未定义的字符串。 - eluleci
问题在于当用户更改浏览器的语言设置时,toLocaleUpper和toLocaleLower将不再起作用。 - cerhart
显示剩余5条评论

27

感谢这个函数,我真的很喜欢它。连续的土耳其语字符输入会将结果显示为'undefined'而不是'ÇÇ'。请尝试将'/+g'替换为'/g'。修改后的函数如下:

String.prototype.turkishToUpper = function(){
var string = this;
var letters = { "i": "İ", "ş": "Ş", "ğ": "Ğ", "ü": "Ü", "ö": "Ö", "ç": "Ç", "ı": "I" };
string = string.replace(/(([iışğüçö]))/g, function(letter){ return letters[letter]; })
return string.toUpperCase();
}

String.prototype.turkishToLower = function(){
var string = this;
var letters = { "İ": "i", "I": "ı", "Ş": "ş", "Ğ": "ğ", "Ü": "ü", "Ö": "ö", "Ç": "ç" };
string = string.replace(/(([İIŞĞÜÇÖ]))/g, function(letter){ return letters[letter]; })
return string.toLowerCase();
}

@scokmen 已收到 - Ahmet Can Güven

3
String.prototype.tUpper = function(){
   return this.replace(/i/g,"İ").toLocaleUpperCase();
}

String.prototype.tLower = function(){
    return this.replace(/I/g,"ı").toLocaleLowerCase();
}

2
请注意,本网站使用的语言是英语。 - László Papp

1
    var  a="lişliş lğüğpğp İŞİŞİŞ lşi ĞĞHFGH ÜGFHFHG ühüüüğ üğüğş ş ş Ş  İ i  ılk Ilk";

var s=a.split(' ');

var netice="";

s.forEach(function(g) {
  if (g.length>1)
    netice+=g[0].toLocaleUpperCase('tr')+
      g.slice(1).toLocaleLowerCase('tr')+" "; 
  else
    netice+=g.toLocaleUpperCase('tr')+" ";
});

alert(netice); 

-1
请查看这段小代码,它可以将文本转换为大写和小写。
var manualLowercase = function(s) {
  return isString(s)
      ? s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);})
      : s;
};

var manualUppercase = function(s) {
  return isString(s)
      ? s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);})
      : s;
};

2
这个答案与问题陈述不符,因为它没有涉及到 iışğüçö,而这正是问题所关注的。您应该删除这个答案。 - toolforger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接