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を参照)。文字列に少なくとも 1 つの 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;
}