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?
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?
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
0x20000 es más grande que 0xfa2d. ¿Cómo viene la condición c> = 0x20000 && c <= 0xFA2D? – cxwangyi
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.
Simplemente compruebe los caracteres para ver si los puntos de código están en el (los) rango (s) deseado (s). Para exampe, consulte esta pregunta:
What's the complete range for Chinese characters in Unicode?
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();
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)
)
en Unicode, chino, japón, y caracteres coreanos se codifican juntos.
visita este FAQ: http://www.unicode.org/faq/han_cjk.html
carácter chino se distribuyen en bloques de serveral.
visita el wiki: https://en.wikipedia.org/wiki/CJK_Unified_Ideographs
Usted encontrará que hay tablas de caracteres CJK serveral en el sitio web de Unicode.
Por simplicidad, sólo puede utilizar mínimo carácter chino y máximo:
0x4e00 y 0x2fa1f comprobar.
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;
}
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);
}
Gracias! Eso funcionó para mí con algunos caracteres chinos que no pasarían en la respuesta de @nasser-hadjloo. –
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. –