C# TextElement枚举器类错误或(泰米尔语)Unicode错误

C# TextElement枚举器类错误或(泰米尔语)Unicode错误,c#,unicode,.net-2.0,tamil,C#,Unicode,.net 2.0,Tamil,为什么TextElementEnumerator没有正确解析泰米尔Unicode字符 using System; using System.Collections.Generic; using System.Globalization; namespace Glyphtest { internal class Program { private static void Main() { const string unico

为什么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;
        }
    }
}
使用系统;
使用System.Collections.Generic;
利用制度全球化;
名称空间字形测试
{
内部课程计划
{
私有静态void Main()
{
常量字符串unicodetxt1=”ஊரவர் கெளவை";
列表输出=音节化(unicodetxt1);
Console.WriteLine(output.Count);
常量字符串unicodetxt2=”கௌவை";
输出=音节化(unicodetxt2);
Console.WriteLine(output.Count);
}
公共静态列表提纲(字符串Unicodext)
{
if(string.IsNullOrEmpty(unicodetext))返回null;
TextElementEnumerator enumerator=StringInfo.GetTextElementEnumerator(unicodetext);
var data=新列表();
while(枚举数.MoveNext())
data.Add(enumerator.Current.ToString());
返回数据;
}
}
}
下面的代码示例处理Unicode字符

"கௌ'-> 0x0bc8(க) +0xbcc(ௌ). (正确格式)

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

这是课堂上的虫子吗, 为什么不从字符串中正确地枚举它呢

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

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


如果是,如何克服此问题。

U+0BB3ᴛᴀᴍɪʟ ʟᴇᴛᴛᴇʀ ʟʟᴀ 具有Grapheme_Cluster_Break=XX(其他)。这使Grapheme群集成为正确的群集,因为在Grapheme_Cluster_Break等于其他的字符之前始终存在一个Grapheme群集Break

由于U+0BCC具有grapheme_cluster_Break=SpacingMark,并且这些字符之前通常没有中断(例外情况是在文本开头或前面有控制字符时)

至少Unicode标准是这么说的()

现在,我不知道泰米尔语是如何运作的,所以请用一小撮盐来理解下面的内容

U+0BCC分解为,这意味着这两个序列(and)在规范上不等价,因此不需要对石墨烯簇进行分割以产生相同的结果

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


恕我直言,我会说你使用了错误的字符,但我一点也不了解泰米尔语,所以我不能确定。

U+0BB3ᴛᴀᴍɪʟ ʟᴇᴛᴛᴇʀ ʟʟᴀ 具有Grapheme_Cluster_Break=XX(其他)。这使Grapheme群集成为正确的群集,因为在Grapheme_Cluster_Break等于其他的字符之前始终存在一个Grapheme群集Break

由于U+0BCC具有grapheme_cluster_Break=SpacingMark,并且这些字符之前通常没有中断(例外情况是在文本开头或前面有控制字符时)

至少Unicode标准是这么说的()

现在,我不知道泰米尔语是如何运作的,所以请用一小撮盐来理解下面的内容

U+0BCC分解为,这意味着这两个序列(and)在规范上不等价,因此不需要对石墨烯簇进行分割以产生相同的结果

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


恕我直言,我会说你使用了错误的字符,但我对泰米尔语一无所知,所以我不能确定。

这不是Unicode字符或类的错误, 具体到语言()

字母由任何字母组成,后跟可视标志符号

例如- க -\u0b95 ெ -\u0bc6 ள -\u0bb3

形成泰米尔文字'கெள' 而它似乎类似于视觉符号的形成

க -\u0b95 ௌ-\u0bcc

以及它正确的解决形式。 因此,在列举泰米尔人的性格之前,我们必须先替换不规则的性格结构

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;
        }
    }
}
与泰米尔语语法规则一样() 视觉符号(ௌ) 将作为一个单词的起始字母出现

因此,上述代码应按如下方式处理:

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 string CheckVisualGlyphPattern(string txt)
    {
        string[] data = txt.Split(new[] { ' ', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
        string list = string.Empty;
        var rx = new Regex("^(.*?){1}(\u0bc6){1}(\u0bb3){1}");
        foreach (string s in data)
        {
            var matches = new List<Match>();
            string outputs = rx.Replace(s, match =>
            {
                matches.Add(match);
                return string.Format("{0}\u0bcc", match.Groups[1].Value);
            });
            list += string.Format("{0} ", outputs);
        }
        return list.Trim();
    }

    public static List<string> Syllabify(string unicodetext)
    {
        var processdata = CheckVisualGlyphPattern(unicodetext);
        if (string.IsNullOrEmpty(processdata)) return null;
        TextElementEnumerator enumerator = StringInfo.GetTextElementEnumerator(processdata);
        var data = new List<string>();
        while (enumerator.MoveNext())
            data.Add(enumerator.Current.ToString());
        return data;
    }
}
内部类程序
{
私有静态void Main()
{
常量字符串unicodetxt1=”ஊரவர் கெளவை";
列表输出=音节化(unicodetxt1);
Console.WriteLine(output.Count);
常量字符串unicodetxt2=”கௌவை";
输出=音节化(unicodetxt2);
Console.WriteLine(output.Count);
}
公共静态字符串检查VisualGlyphPattern(字符串txt)
{
string[]data=txt.Split(新[]{'','\r','\n'},StringSplitOptions.RemoveEmptyEntries);
string list=string.Empty;
var rx=new Regex(“^(.*){1}(\u0bc6){1}(\u0bb3){1}”);
foreach(数据中的字符串s)
{
var matches=新列表();
字符串输出=接收。替换,匹配=>
{
匹配。添加(匹配);
返回string.Format(“{0}\u0bcc”,match.Groups[1].Value);
});
list+=string.Format(“{0}”,输出);
}
returnlist.Trim();
}
公共静态列表提纲(字符串Unicodext)
{
var processdata=CheckVisualGlyphPattern(unicodetext);
if(string.IsNullOrEmpty(processdata))返回null;
TextElementEnumerator枚举器=StringInfo.G