1

为什么 TextElementEnumerator 不能正确解析泰米尔语 Unicode 字符。

using System;
using System.Collections.Generic;
using System.Globalization;

namespace Glyphtest
{
    internal class Program
    {
        private static void Main()
        {
            const string unicodetxt1 = "ஊரவர் கெளவை";
            List<string> output = Syllabify(unicodetxt1);
            Console.WriteLine(output.Count);
            const string unicodetxt2 = "கௌவை";
            output = Syllabify(unicodetxt2);
            Console.WriteLine(output.Count);
        }

        public static List<string> Syllabify(string unicodetext)
        {
            if (string.IsNullOrEmpty(unicodetext)) return null;
            TextElementEnumerator enumerator = StringInfo.GetTextElementEnumerator(unicodetext);
            var data = new List<string>();
            while (enumerator.MoveNext())
                data.Add(enumerator.Current.ToString());
            return data;
        }
    }
}

以下代码示例处理 Unicode 字符

'கௌ'-> 0x0bc8 (க) +0xbcc(ௌ)。(正确的形式)

'கௌ'->0x0bc8 (க) +0xbc6(ெ) + 0xbb3(ள)(格式正确)

它是Text Element Enumerator Class 中的错误,为什么不从字符串中正确枚举它。

ie கெளவை => 'கெள'+ 'வை' 必须以正确的形式列举

கெளவை => 'கெ' +'ள' +'வை' 不能以不正确的形式列举。

如果是这样如何克服这个问题。

4

2 回答 2

1
于 2013-10-11T07:06:38.393 回答
0

U+0BB3 ᴛᴀᴍɪʟ ʟᴇᴛᴛᴇʀ ʟʟᴀ 具有 Grapheme_Cluster_Break=XX(其他)。这使得字素簇 <U+0BC8 U+0BC6><U+0BB3> 是正确的,因为在 Grapheme_Cluster_Break 等于 Other 的字符之前总是有一个字素簇中断。

<U+0BC8 U+0BCC> 没有内部字素簇中断,因为 U+0BCC 具有 Grapheme_Cluster_Break=SpacingMark 并且在此类字符之前通常没有中断(例外情况是在文本开头或前面有控制字符时)。

好吧,至少这是 Unicode 标准必须说的(http://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries)。

现在,我不知道泰米尔语是如何工作的,所以请注意以下内容。

U+0BCC 分解为 <U+0BC6 U+0BD7>,意味着两个序列(<U+0BC8 U+0BC6 U+0BB3> 和 <U+0BC8 U+0BCC>)不是规范等价的,因此不需要字素簇分割以产生相同的结果。

当我用我不懂泰米尔语的眼睛看它时,似乎 U+0BCC ᴛᴀᴍɪʟ ᴀᴜ ʟᴇɴɢᴛʜ ᴍᴀʀᴋ 和 U+0BB3 ᴛᴀᴍɪʟ ʟᴇᴛᴛᴇʀ ʟʟᴀ 看起来完全一样。但是,U+0BCC 是间距标记,但 U+0BB3 不是。如果您在输入中使用 U+0BCC 而不是 U+0BB3,那么结果就是您所期望的。

冒个泡,我会说你使用了错误的字符,但是,再说一次,我根本不认识泰米尔语,所以我不能确定。

于 2013-09-24T14:27:06.630 回答