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