簡體   English   中英

如何在C#中找到字符串的第一個強方向性字符?

[英]How can I find the first strong directionality character of a string in C#?

假設我獲得可以有混合左到右,右到左內容的字符串,我想找到的第一個強方向性性格在里面,定義在這里

我想我在這個問題上找到了一個很好的起點,但我仍然無法弄清楚BiDi類別與強方向性特征之間的關系。 有可能在C#中弄清楚嗎?

我沒有依賴於內部實現,而是采取了一種略有不同的方法,該方法可以進行優化,但是有足夠的基礎來回答您的問題。

我只是下載UnicodeData.txt ,它是unicode版本的官方發行版的一部分。 該文件包含每個unicode字符的編號和一些用分號分隔的字段。 典型的行如下所示:

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

第五個字段包含雙向類值

掌握了這些知識之后,天真的解析器將讀取數據,然后使用它檢查演示字符串,如下所示:

// 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++;
}

運行時,您將看到“強類型”字符以及在何處找到它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM