Символы Юникода имеют различные свойства, связанные с ними.Эти свойства не могут быть получены из кодовой точки;вам нужна таблица, которая сообщает вам, имеет ли персонаж определенное свойство или нет.
Вас интересуют символы со двунаправленным свойством "R" или "AL" (RandALCat).
Символ RandALCat - это символ с однозначной направленностью справа налево.
Вот полный список, начиная с Unicode 3.2 (из RFC 3454 ):
D. Bidirectional tables
D.1 Characters with bidirectional property "R" or "AL"
----- Start Table 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
----- End Table 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;
}