计算外语中的字符数

时间:2012-12-11 07:39:53

标签: javascript character-encoding

是否有任何最佳方式来实现非英文字母的字符数?例如,如果我们用英语中的“母亲”这个词,它就是一个6个字母的单词。但是如果你在泰米尔语中键入相同的单词(மதர்),它是一个三个字母的单词(ம+த+ர்),但最后一个字母(ர்)将被系统视为两个字符(ர+ஂ=ர்)。那么有没有办法计算真实角色的数量?

一个线索是,如果我们将键盘中的光标移动到单词(மதர்)中,它将仅通过3个字母而不是系统考虑的4个字符,所以有没有办法通过使用这个来找到解决方案?任何有关这方面的帮助将不胜感激......

2 个答案:

答案 0 :(得分:8)

更新

从午餐回来=) 我担心以前用任何外语都不会很好 所以我添加了另一种可能的方式

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


经过一些字符串操作试验后,结果证明了这一点 <{1}}为

返回相同的内容

String.indexOf"ர்" 这意味着
"ர"但是 "ர்ரர".indexOf("ர்") == "ர்ரர".indexOf("ர" + "்") //true // false

我借此机会尝试过这样的事情

"ர்ரர".indexOf("ர") == "ர்ரர".indexOf("ர" + "ர")

这似乎适用于上面的字符串,它可能需要一些调整,因为我不知道关于编码和东西的事情,但也许它可以开始点

继承人JSBin

答案 1 :(得分:2)

您可以使用此功能忽略计数计算中的组合标记:

function charCount( str ) {
    var re = /[\u0300-\u036f\u1dc0-\u1dff\u20d0-\u20ff\ufe20-\ufe2f\u0b82\u0b83\u0bbe\u0bbf\u0bc0-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7]/g
    return str.replace( re, "").length;
}

console.log(charCount('மதர்'))// 3

//More tests on random Tamil text:
//Paint the text character by character to verify, for instance 'யெ' is a single character, not 2

console.log(charCount("மெய்யெழுத்துக்கள்")); //9
console.log(charCount("ஒவ்வொன்றுடனும்")); //8
console.log(charCount("தமிழ்")); //3
console.log(charCount("வருகின்றனர்.")); //8
console.log(charCount("எழுதப்படும்")); //7

泰米尔语标志和标记不是由单个字符组成,其目标字符为unicode,因此标准化无济于事。我手动添加了all the Tamil combining marks or signs 到正则表达式,但它还包括正常组合标记的范围,因此无论标准化形式如何,charCount("ä")都是1