0
假設我得到一個可以混合左向右和從右向左的內容的字符串,我想找到第一個強方向性字符,如定義here。如何在C#中找到字符串的第一個強方向性字符?
我想我在this的問題中找到了一個好的起點,但是我仍然無法弄清楚BiDi類是如何與強方向性特徵相關的。是否有可能在C#中解決這個問題?
假設我得到一個可以混合左向右和從右向左的內容的字符串,我想找到第一個強方向性字符,如定義here。如何在C#中找到字符串的第一個強方向性字符?
我想我在this的問題中找到了一個好的起點,但是我仍然無法弄清楚BiDi類是如何與強方向性特徵相關的。是否有可能在C#中解決這個問題?
我沒有依賴內部實現,而是採取了一種稍微不同的方法,這種方法可以優化,但爲回答您的問題提供了足夠的基礎。
我只是下載了作爲unicode版本的正式版本的一部分的UnicodeData.txt
。該文件包含每個Unicode字符的編號和一些以分號分隔的字段。典型的線路如下所示:
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字符枚舉。更好的是,它來自官方消息。謝謝! –