Los caracteres Unicode tienen propiedades diferentes asociadas. Estas propiedades no pueden derivarse del punto de código; necesitas una tabla que te diga si un personaje tiene cierta propiedad o no.
Le interesan los caracteres con propiedad bidireccional "R" o "AL" (RandALCat).
Un personaje de RandALCat es un personaje con direccionalidad de derecha a izquierda sin ambigüedades.
Aquí está la lista completa de Unicode 3.2 (de 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 -----
Aquí hay un código para obtener la lista completa de 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"));
}
Tenga en cuenta que estos valores son puntos de código Unicode. Las cadenas en C# /. NET están codificadas en UTF-16 y deben convertirse a puntos de código Unicode primero (consulte Char.ConvertToUtf32). Aquí es un método que comprueba si una cadena contiene al menos un carácter 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;
}
¡Gracias por esto! Me preguntaba qué pensarías del enfoque de Brent. –
@Patrick Kluge: el motor de expresiones regulares aparentemente contiene una tabla de propiedades Unicode. Pero no veo bloques con nombre para todos los personajes de RandALCat. Por lo tanto, depende del nivel de corrección que necesite: si detectar árabe, hebreo y algunos otros caracteres es lo suficientemente bueno para usted, busque expresiones regulares. Si necesita detectar cualquier personaje RandALCat en existencia, construya su propia tabla y verifique la cadena de entrada usted mismo como se muestra arriba. – dtb
Me pregunto qué piensa del símbolo ۞, que es tratado de derecha a izquierda por productos de software como Google Chrome y MS Word, pero no está marcado como RandALCat en la especificación Unicode. –