2011-05-22 14 views
13

Recibiré el texto de un usuario que necesito validar es un carácter chino.¿Hay alguna forma de comprobar si el texto Unicode está en un idioma determinado?

¿Hay alguna manera de que pueda verificar esto?

+2

Comprobación de si una cadena contiene sólo caracteres chinos válidos no es lo mismo que decir que esto es en chino. Obviamente, puedes escribir una cadena sin sentido de caracteres chinos. Pero también estoy pensando en un lenguaje que comparte muchos caracteres con chino (japonés, antiguo texto coreano). Ver la unificación de CJK. Mis dos centavos. –

Respuesta

15

De acuerdo con la información proporcionada here in unicode website se puede encontrar el bloque de chino o cualquier otro idioma y luego poner en práctica un programa de análisis para comprobar si una palabra está en el rango o no. al igual que

public bool IsChinese(string text) 
{ 
    return text.Any(c => c >= 0x20000 && c <= 0xFA2D); 
} 

Tenga en cuenta que

Como una referencia práctica, el Consorcio Unicode here proporciona una interfaz de búsqueda a la Unicode Han (漢) Database (Unihan).

El enlace de la base de datos que había proporcionado anteriormente que está mostrando los caracteres

+6

0x20000 es más grande que 0xfa2d. ¿Cómo viene la condición c> = 0x20000 && c <= 0xFA2D? – cxwangyi

-1

Necesita consultar la base de datos de caracteres Unicode, que contiene información sobre cada carácter Unicode. Probablemente hay una función de utilidad en C# que puede hacer esto por usted. De lo contrario, puedes descargarlo de internet.

6

Puede utilizar expresiones regulares para que coincida con Supported Named Blocks:

private static readonly Regex cjkCharRegex = new Regex(@"\p{IsCJKUnifiedIdeographs}"); 
public static bool IsChinese(this char c) 
{ 
    return cjkCharRegex.IsMatch(c.ToString()); 
} 

A continuación, puede utilizar:

if (sometext.Any(z=>z.IsChinese())) 
    DoSomething(); 
0

De acuerdo con la wikipedia (https://en.wikipedia.org/wiki/CJK_Compatibility) hay varios diapasones de código de caracteres. Aquí es mi método para detectar los caracteres chinos basados ​​en enlace de arriba (código en C#, pero se puede convertir fácilmente)

let isChinese(text: string) = 
      text |> Seq.exists (fun c -> 
       let code = int c 
       (code >= 0x4E00 && code <= 0x9FFF) || 
       (code >= 0x3400 && code <= 0x4DBF) || 
       (code >= 0x3400 && code <= 0x4DBF) || 
       (code >= 0x20000 && code <= 0x2CEAF) || 
       (code >= 0x2E80 && code <= 0x31EF) || 
       (code >= 0xF900 && code <= 0xFAFF) || 
       (code >= 0xFE30 && code <= 0xFE4F) || 
       (code >= 0xF2800 && code <= 0x2FA1F) 
       ) 
0

Esto funcionó para mí:

var charArray = text.ToCharArray(); 
var isChineseTextPresent = false; 


foreach (var character in charArray) 
{ 
    var cat = char.GetUnicodeCategory(character); 


    if (cat != UnicodeCategory.OtherLetter) 
    { 
     continue; 
    } 


    isChineseTextPresent = true; 
    break; 
} 
3

Como varias personas han mencionado aquí, en Unicode, chino, japón, y caracteres coreanos se codifican juntos, y hay varios rangos a ella. https://en.wikipedia.org/wiki/CJK_Compatibility

Para la simplicidad, aquí hay un ejemplo de código que detecta todo el rango CJK:

public bool IsChinese(string text) 
{ 
    return text.Any(c => (uint)c >= 0x4E00 && (uint)c <= 0x2FA1F); 
} 
+0

Gracias! Eso funcionó para mí con algunos caracteres chinos que no pasarían en la respuesta de @nasser-hadjloo. –

Cuestiones relacionadas