【问题标题】:How can I find the first strong directionality character of a string in C#?如何在 C# 中找到字符串的第一个强方向性字符?
【发布时间】:2016-01-20 13:47:34
【问题描述】:

假设我得到一个可以混合从左到右和从右到左内容的字符串,我想在其中找到第一个强方向性字符,定义为here

我想我在this 问题中找到了一个很好的起点,但我仍然无法弄清楚 BiDi 类别与强方向性特征之间的关系。是否有可能在 C# 中解决这个问题?

【问题讨论】:

    标签: c# .net unicode right-to-left cultureinfo


    【解决方案1】:

    我没有依赖内部实现,而是采用了一种稍微不同的方法,该方法对优化开放,但提供了足够的基础来回答您的问题。

    我只需下载UnicodeData.txt,它是 unicode 版本的正式版本的一部分。该文件包含每个 unicodecharacter 的编号和一些分号分隔的字段。典型的行如下所示:

    0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061;
    

    第五个字段包含Bidirectional Class Value

    有了这些知识,读取数据然后检查演示字符串的简单解析器看起来像这样:

    // hold chars with their Bidi Class Value
    var udb = new Dictionary<char, string>();
    
    // download UnicodeData txt file
    var cli = new WebClient();
    var data = cli.DownloadData("http://www.unicode.org/Public/UNIDATA/UnicodeData.txt");
    // parse
    using (var ms = new MemoryStream(data))
    {
        var sr = new StreamReader(ms, Encoding.UTF8);
        var line = sr.ReadLine();
        while (line != null)
        {
            var fields = line.Split(';');
    
            int uc = int.Parse(fields[0], NumberStyles.HexNumber);
            // above 0xffff we're lost
            if (uc > 0xffff) break;
    
            var ch = (char) uc;
            var bca = fields[4];
    
            udb.Add(ch, bca);
    
            line = sr.ReadLine();
        }
    }
    
    // test string
    var s = "123A\xfb1d\x0620";
    
    Console.WriteLine(s);
    var pos = 0;
    foreach(var c in s)
    {
    
        var bcv = udb[c]; // for a char get the Bidi Class Value
        if (bcv == "L" || bcv == "R" || bcv == "AL")
        {
            Console.WriteLine(
                "{0} - {1} : {2} [{3}]", 
                c, 
                pos, 
                CharUnicodeInfo.GetUnicodeCategory(c), 
                bcv); 
        }
        pos++;
    }
    

    运行时,您会看到属于强类型的字符以及它们是在哪个位置找到的。

    【讨论】:

    • 这实际上是一个很好的解决方案,我不知道那里有一个可解析的 Unicode 字符枚举。更好的是,它来自官方来源。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 2022-01-01
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    相关资源
    最近更新 更多