我有我解决不了,由于非英文字母一个JavaScript大小写转换问题。 我主要关注的是土耳其语字母。
我需要做的是这样的:
- 你好世界=>的Hello World
- HELLO WORLD =>的Hello World
- HELLO WORLD =>的Hello World
这是我到目前为止已经完成:
String.prototype.turkishToUpper = function(){
var stringlow = this;
var letterslow = { 'i': 'İ', 'ş': 'Ş', 'ğ': 'Ğ', 'ü': 'Ü', 'ö': 'Ö', 'ç': 'Ç', 'ı': 'I' };
stringlow = stringlow.replace(/(([iışğüçö]))/g, function(letterlow){ return letterslow[letterlow]; })
return stringlow.toUpperCase();
}
String.prototype.turkishToLower = function(){
var stringup = this;
var lettersup = { 'İ': 'i', 'I': 'ı', 'Ş': 'ş', 'Ğ': 'ğ', 'Ü': 'ü', 'Ö': 'ö', 'Ç': 'ç' };
stringup = stringup.replace(/(([İIŞĞÜÇÖ]))/g, function(letterup){ return lettersup[letterup]; })
return stringup.toLowerCase();
}
String.prototype.toProperCase = function () {
return this.replace(/\w\S*/g, function(txt){return txt.charAt(0).turkishToUpper() + txt.substr(1).turkishToLower();});
};
但是,这并没有给我正确的结果,我怀疑正则表达式替换不要正对Unicode的使用,但ASCII。
当我与土耳其字符测试,我得到错误的结果。
- 它成为食糖替代糖
- 它成为牧羊人河这一翻译的河河流牧羊人牧羊人
此外,如果这都不能得到解决,我需要独立的话,不仅空间,但也被一些其他停止字符,如在一种锦上添花: - = /等,使
- 你好,世界变得您好,世界
- 你好:世界变得您好:世界
我经过这里就这么多类似的问题阅读,但至今没有运气。
谢谢
注:我觉得这就是所谓的标题案例,但有些人认为它是Pascal大小写。 坦率地说,我有兴趣在解决统一问题(我认为这是根本原因),而不是语义,所以请原谅我,如果我用错了术语:)
独立功能:
function toProperCase(s){
return s.replace(/([^\s:\-])([^\s:\-]*)/g,function($0,$1,$2){
return $1.toUpperCase()+$2.toLowerCase();
});
}
或String.prototype延伸:
String.prototype.toProperCase=function() {
return this.replace(/([^\s:\-])([^\s:\-]*)/g,function($0,$1,$2){
return $1.toUpperCase()+$2.toLowerCase();
});
}
"çoban ırmak becomes çOban ıRmak intead of Çoban Irmak Hello-wOrld".toProperCase();
// "Çoban Irmak Becomes Çoban Irmak Intead Of Çoban Irmak Hello-World"
更新:
接着代码使用自定义功能,用于将特定于语言环境字符(部分测试)。 代码添加功能于String.prototype
: toLocaleProperCase2
, toLocaleLowerCase2
和toLocaleUpperCase2
。
(function(){
// locale specific chars
// IMPORTANT: name of locale must be always in lower case (for "tr-TR" locale - "tr-tr") !!!
var localeInfos={
"tr-tr": { lower: { i:"İ", ı:"I", ş:"Ş", ğ:"Ğ", ü:"Ü", ç:"Ç", ö:"Ö" },
upper: { İ:"i", I:"ı", Ş:"ş", Ğ:"ğ", Ü:"ü", Ç:"ç", Ö:"ö" } }
},
localeInfo;
// helper vars
var mask="\\s:\\-", // add additional delimeters chars to the mask if needed
rg=new RegExp("([^"+mask+"])([^"+mask+"]*)","g");
var fnToLocaleLower=function(s){ return localeInfo.upper[s]; },
fnToLocaleUpper=function(s){ return localeInfo.lower[s]; },
fnToProper=function($0,$1,$2){
if(localeInfo){
if(localeInfo.lower.hasOwnProperty($1))$1=localeInfo.lower[$1];
$2=$2.replace(localeInfo.upperSearchRegExp,fnToLocaleLower);
}
return $1.toUpperCase()+$2.toLowerCase();
};
// helper calculations
var localeInfosKeys=Object.keys(localeInfos);
for(var i=0;localeInfo=localeInfos[localeInfosKeys[i]];i++){
localeInfo.lowerSearchRegExp=new RegExp("["+Object.keys(localeInfo.lower).join("")+"]","g");
localeInfo.upperSearchRegExp=new RegExp("["+Object.keys(localeInfo.upper).join("")+"]","g");
}
// extending String.prototype
String.prototype.toLocaleProperCase2=function toLocaleProperCase2(locale){
localeInfo=localeInfos[arguments.length?locale.toLowerCase():null];
return this.replace(rg,fnToProper);
};
String.prototype.toLocaleLowerCase2=function toLocaleLowerCase2(locale){
return ((localeInfo=localeInfos[arguments.length?locale.toLowerCase():null]) ?
this.replace(localeInfo.upperSearchRegExp,fnToLocaleLower):
this).toLowerCase();
};
String.prototype.toLocaleUpperCase2=function toLocaleUpperCase2(locale){
return ((localeInfo=localeInfos[arguments.length?locale.toLowerCase():null]) ?
this.replace(localeInfo.lowerSearchRegExp,fnToLocaleUpper) :
this).toUpperCase();
};
})();
// testing
var sss="çoban ırmak ibecıoimes çOban ıRmak intead of Çoban IrImaİk Hello-wOrld";
console.log("Origin: ", sss);
console.log("Proper TR: ", sss.toLocaleProperCase2("tr-TR"));
console.log("Proper: ", sss.toLocaleProperCase2());
console.log("Lower TR: ", sss.toLocaleLowerCase2("tr-TR"));
console.log("Lower: ", sss.toLocaleLowerCase2());
console.log("Upper TR: ", sss.toLocaleUpperCase2("tr-TR"));
console.log("Upper: ", sss.toLocaleUpperCase2());
// Origin: çoban ırmak ibecıoimes çOban ıRmak intead of Çoban IrImaİk Hello-wOrld
// Proper TR: Çoban Irmak İbecıoimes Çoban Irmak İntead Of Çoban Irımaik Hello-World
// Proper: Çoban Irmak Ibecıoimes Çoban Irmak Intead Of Çoban Irimaik Hello-World
// Lower TR: çoban ırmak ibecıoimes çoban ırmak intead of çoban ırımaik hello-world
// Lower: çoban ırmak ibecıoimes çoban ırmak intead of çoban irimaik hello-world
// Upper TR: ÇOBAN IRMAK İBECIOİMES ÇOBAN IRMAK İNTEAD OF ÇOBAN IRIMAİK HELLO-WORLD
// Upper: ÇOBAN IRMAK IBECIOIMES ÇOBAN IRMAK INTEAD OF ÇOBAN IRIMAİK HELLO-WORLD
String.prototype.toProperCase = function (){
var arr= this.toLowerCase().split(' ');
for( var i=0;i<arr.length;i++){
arr[i] = arr[i].charAt(0).toUpperCase() + arr[i].substr(1);
};
return arr.join(' ');
};
'çoban ırmak'.toProperCase() // "Çoban Irmak"
这里是JS函数,将做的工作。
function toProperCase(string) {
output = '';
explodedString = string.split(' '); //explode string by space
for(var i=0;i<explodedString.length;i++){
output += explodedString[i].charAt(0).toUpperCase() + explodedString[i].slice(1).toLowerCase()+' ';
}
return output.slice(0, -1);
}
只是另一种选择,但与上锦上添花:
function toProperCase( str ) {
var i,
j,
chars,
arr;
arr = str.toLowerCase( ).split("");
chars = {
" " : true,
"-" : true,
":" : true,
"=" : true,
"/" : true
};
for( var i = 0, j = -1; i < arr.length; i += 1, j += 1 ) {
// if previous char (j) exists in chars and current (i) does not;
// replace with uppercase equivalent.
if ( ( arr[j] && chars[ arr[j] ] && !chars[ arr[i] ] ) || i === 0){
arr[i] = arr[i].toUpperCase( );
}
}
return arr.join("");
}
希望帮助:)