Unicode 字符具有与之关联的不同属性。这些属性不能从代码点派生;你需要一个表格来告诉你一个角色是否具有某种属性。
您对具有双向属性“R”或“AL”(RandALCat)的字符感兴趣。
RandALCat 字符是具有明确从右到左方向性的字符。
以下是 Unicode 3.2 的完整列表(来自RFC 3454):
D. 双向表
D.1 具有双向属性“R”或“AL”的字符
----- 开始表 D.1 -----
05BE
05C0
05C3
05D0-05EA
05F0-05F4
061B
061F
0621-063A
0640-064A
066D-066F
0671-06D5
06DD
06E5-06E6
06FA-06FE
0700-070D
0710
0712-072C
0780-07A5
07B1
200F
FB1D
FB1F-FB28
FB2A-FB36
FB38-FB3C
FB3E
FB40-FB41
FB43-FB44
FB46-FBB1
FBD3-FD3D
FD50-FD8F
FD92-FDC7
FDF0-FDFC
FE70-FE74
FE76-FEFC
----- 结束表 D.1 -----
以下是获取 Unicode 6.0 的完整列表的一些代码:
var url = "http://www.unicode.org/Public/6.0.0/ucd/UnicodeData.txt";
var query = from record in new WebClient().DownloadString(url).Split('\n')
where !string.IsNullOrEmpty(record)
let properties = record.Split(';')
where properties[4] == "R" || properties[4] == "AL"
select int.Parse(properties[0], NumberStyles.AllowHexSpecifier);
foreach (var codepoint in query)
{
Console.WriteLine(codepoint.ToString("X4"));
}
请注意,这些值是 Unicode 代码点。C#/.NET 中的字符串是 UTF-16 编码的,需要先转换为 Unicode 代码点(请参阅Char.ConvertToUtf32)。这是一种检查字符串是否至少包含一个 RandALCat 字符的方法:
static void IsAnyCharacterRightToLeft(string s)
{
for (var i = 0; i < s.Length; i += char.IsSurrogatePair(s, i) ? 2 : 1)
{
var codepoint = char.ConvertToUtf32(s, i);
if (IsRandALCat(codepoint))
{
return true;
}
}
return false;
}