如何在 C# 中找到字符串的第一个强方向性字符?
How can I find the first strong directionality character of a string in C#?
假设我得到一个可以混合从左到右和从右到左内容的字符串,我想在其中找到第一个强方向性字符,如定义的那样here。
我认为我在this问题中找到了一个很好的起点,但我仍然无法弄清楚 BiDi 类别与强方向性特征有何关系。有可能在 C# 中解决这个问题吗?
我没有依赖内部实现,而是采用了一种稍微不同的方法,该方法可以进行优化,但提供了足够的基础来回答您的问题。
我只是下载了UnicodeData.txt
,这是官方发布的一个unicode版本的一部分。该文件包含每个 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++;
}
当 运行 时,您将看到属于强类型的字符以及找到它们的位置。
假设我得到一个可以混合从左到右和从右到左内容的字符串,我想在其中找到第一个强方向性字符,如定义的那样here。
我认为我在this问题中找到了一个很好的起点,但我仍然无法弄清楚 BiDi 类别与强方向性特征有何关系。有可能在 C# 中解决这个问题吗?
我没有依赖内部实现,而是采用了一种稍微不同的方法,该方法可以进行优化,但提供了足够的基础来回答您的问题。
我只是下载了UnicodeData.txt
,这是官方发布的一个unicode版本的一部分。该文件包含每个 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++;
}
当 运行 时,您将看到属于强类型的字符以及找到它们的位置。