2012-02-19 11 views
5

Estoy desarrollando una heurística para la detección automática del lenguaje y me gustaría saber si la letra dada tiene signos diacríticos (como "Ðàäèî Êóëüòóðà" - todas las letras tienen signos diacríticos). Sería mejor si también pudiera obtener el tipo de diacrítico, si es posible.¿Cómo comprobar si el carácter Unicode tiene signos diacríticos en .Net?

He navegado por UnicodeCategory enumerado, pero no he encontrado nada que me pueda ayudar aquí.

+0

La letra eth (Ð) no tiene ningún signo diacrítico. En Unicode, es un personaje básico; el trazo no se considera como un signo diacrítico. Es posible que desee reformular su objetivo (y posiblemente explicar qué problema específico resolvería, ya que podría haber mejores enfoques). –

+2

Descomponer es lo último que quieres hacer. La combinación de una letra específica con un signo diacrítico específico es un selector fuerte para el idioma. Simplemente construya las tablas de frecuencia por adelantado. Pero hay muchos idiomas que no son diacríticos. Por ejemplo, no podrá distinguir entre inglés, holandés e italiano. Necesitarás un diccionario para que realmente funcione. Almacenar, por ejemplo, las 100 palabras más comunes recorrerán un largo camino. –

Respuesta

11

Una forma posible es normalizarlo a una forma donde las letras y sus signos diacríticos se escriben como varios puntos de código. Luego verifique si tiene una letra seguida de acentos.

Adaptado de How do I remove diacritics (accents) from a string in .NET?, puede normalizar con Normalize(NormalizationForm.FormD) y comprobar si los signos diacríticos con UnicodeCategory.NonSpacingMark.

bool IsLetterWithDiacritics(char c) 
{ 
    var s = c.ToString().Normalize(NormalizationForm.FormD); 
    return (s.Length > 1) && 
      char.IsLetter(s[0]) && 
      s.Skip(1).All(c2 => CharUnicodeInfo.GetUnicodeCategory(c2) == UnicodeCategory.NonSpacingMark); 
} 
+3

Si necesita una verificación de verdadero/falso, puede simplemente normalizarlo a FormD o lo que sea, y simplemente verificar si la cadena es más larga que la original. –

+1

@JoakimJohansson No me sorprendería si hubiera otros glifos que se descompongan en FormD, pero no son letras acentuadas. Pero no sé qué tan bien se comportaría mi idea en eso tampoco. – CodesInChaos

+2

@JoakimJohansson Una gran clase de personajes que tu algoritmo considera diacríticos son los caracteres hangul coreanos. Estos constan de varias partes, que se descomponen, pero no son diacríticos. Algunos ejemplos: '가', '간', '갂'. Luego hay símbolos matemáticos tales como: '≠', '⊉',' ∄', '∦' Y finalmente algunos que no conozco en absoluto:' ஔ' – CodesInChaos

Cuestiones relacionadas