アップデート
昼食から戻る =) 残念ながら、以前の方法はどの外国語でもうまく機能しないのではないかと心配しています。
var UnicodeNsm = [Array 1280] //It holds all escaped Unicode Non Space Marks
function countNSMString(str) {
var chars = str.split("");
var count = 0;
for (var i = 0,ilen = chars.length;i<ilen;i++) {
if(UnicodeNsm.indexOf(escape(chars[i])) == -1) {
count++;
}
}
return count;
}
var English = "Mother";
var Tamil = "மதர்";
var Vietnamese = "mẹ"
var Hindi = "मां"
function logL (str) {
console.log(str + " has " + countNSMString(str) + " visible Characters and " + str.length + " normal Characters" ); //"மதர் has 3 visible Characters"
}
logL(English) //"Mother has 6 visible Characters and 6 normal Characters"
logL(Tamil) //"மதர் has 3 visible Characters and 4 normal Characters"
logL(Vietnamese) //"mẹ has 2 visible Characters and 3 normal Characters"
logL(Hindi) //"मां has 1 visible Characters and 3 normal Characters"
したがって、これは文字列に Unicode NSM 文字である文字があるかどうかをチェックし、そのカウントを無視します。これは、タミル語のみではなく、ほとんどの言語で機能するはずです。また、1280 個の要素を持つ配列はそれほど大きくないはずです。パフォーマンスの問題
これは Unicode NSM のリストです
http://www.fileformat.info/info/unicode/category/Mn/list.htm
対応するJSBinは次のとおりです
文字列操作を少し試した後
String.indexOf
、同じものを返すことがわかりました
"ர்"
そして"ர"
意味のため
"ர்ரர".indexOf("ர்") == "ர்ரர".indexOf("ர" + "்") //true
に
"ர்ரர".indexOf("ர") == "ர்ரர".indexOf("ர" + "ர")
//false
これを機会に、こんなことをしてみました
//ர்
var char = "ரர்ர்ரர்்";
var char2 = "ரரர்ர்ரர்்";
var char3 = "ர்ரர்ர்ரர்்";
function countStr(str) {
var chars = str.split("");
var count = 0;
for(var i = 0, ilen = chars.length;i<ilen;i++) {
var chars2 = chars[i] + chars[i+1];
if (str.indexOf(chars[i]) == str.indexOf(chars2))
i += 1;
count++;
}
return count;
}
console.log("--");
console.log(countStr(char)); //6
console.log(countStr(char2)); //7
console.log(countStr(char3)); //7
上記の文字列でうまくいくようですが、エンコーディングなどについて何も知らないので、いくつかの調整が必要になるかもしれませんが、おそらくそれはあなたが始めることができるポイントです
JSBinはこちら