8
4

2 回答 2

3

我不能说这是一个完整的解决方案。但是在一定程度上可以对单词的形成方式有一些基本的了解:

var k = 'ಕನ್ನಡ';
var parts = k.split('');
arr = []; 
for(var i=0; i< parts.length; i++) {
  var s = k.charAt(i); 

  // while the next char is not a swara/vyanjana or previous char was a virama 
  while((i+1) < k.length && k.charCodeAt(i+1) < 0xC85 || k.charCodeAt(i+1) > 0xCB9 || k.charCodeAt(i) == 0xCCD) { 
    s += k.charAt(i+1); 
    i++; 
  } 
  arr.push(s);
}
console.log(arr);

正如代码中的注释所说,我们不断将字符附加到前一个字符,只要它们不是swaravyanjana前一个字符是 a virama。您可能必须使用不同的词来确保涵盖不同的情况。这种特殊情况不包括数字。

对于字符代码,您可以参考此链接: http ://www.unicode.org/charts/PDF/U0C80.pdf

于 2017-06-01T13:23:20.393 回答
2

考虑使用与 Unicode 字符相关的“inSC”属性——您可以从数据库中获取该属性——它表示印度音节字符。(您可能还想查阅“类别”,看看它是否是“非间距标记”)。例如,“್”的类型为“Virama”(参见http://graphemica.com/0CCD)。再举一个例子,“ಿ”(KANNADA VOWEL SIGN I)的 InSC 为“Vowel_Dependent”(并且是也属于“非间距标记”类别)。然后您可能会检测哪些单个字素需要与其他字素组合,并将完整的字符组合在一起,如下所示:

const graphemes = [..."ಕನ್ನಡ"];

console.log("graphemes are", graphemes);

const rebuild = [graphemes[0], graphemes.slice(1, 4).join(''), graphemes[4]];

console.log(rebuild);

即使你能完成这项工作,你也会有更多的工作要做。我不清楚您将如何检测到三个字符“ನ”、“್”和“ನ”将被组合,而不是被视为两个字符“ನ್”和“ನ”。问题是在在这种情况下,virama 用于表示辅音簇,因此您需要识别 XVX 模式(其中 V 是 virama)并将其视为一个组合字符。可能还有很多很多其他这样的特殊情况。

这可能很有趣:https ://www.microsoft.com/typography/OpenTypeDev/kannada/intro.htmj 。它谈到了寻找“音节簇”,在这种特殊情况下,作为图形渲染字符的前奏。您可能还想看看http://www.unicode.org/L2/L2003/03068-kannada.pdf

于 2017-06-01T13:18:19.590 回答