2016-01-20 27 views

回答

1

我沒有依賴內部實現,而是採取了一種稍微不同的方法,這種方法可以優化,但爲回答您的問題提供了足夠的基礎。

我只是下載了作爲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++; 
} 

運行時,你會發現是強類型的字符,他們在哪個位置被發現。

+0

這實際上是一個非常好的解決方案,我不知道那裏有一個可解析的Unicode字符枚舉。更好的是,它來自官方消息。謝謝! –

相關問題