¿Cómo reconocer si una cadena contiene caracteres unicode?

Tengo una cadena y quiero saber si tiene caracteres Unicode dentro o no. (si contiene completamente ASCII o no)

¿Cómo puedo lograr eso?

¡Gracias!

Si mis suposiciones son correctas, desea saber si su cadena contiene caracteres “no ANSI”. Puedes derivar esto de la siguiente manera.

public void test() { const string WithUnicodeCharacter = "a hebrew character:\uFB2F"; const string WithoutUnicodeCharacter = "an ANSI character:Æ"; bool hasUnicode; //true hasUnicode = ContainsUnicodeCharacter(WithUnicodeCharacter); Console.WriteLine(hasUnicode); //false hasUnicode = ContainsUnicodeCharacter(WithoutUnicodeCharacter); Console.WriteLine(hasUnicode); } public bool ContainsUnicodeCharacter(string input) { const int MaxAnsiCode = 255; return input.Any(c => c > MaxAnsiCode); } 

Actualizar

Esto detectará ASCII extendido. Si solo detecta el verdadero rango de caracteres ASCII (hasta 127), entonces podría obtener falsos positivos para caracteres ASCII extendidos que no denotan Unicode. He aludido a esto en mi muestra.

Si una cadena contiene solo caracteres ASCII, un paso de serialización + deserialización con encoding ASCII debería volver a tener la misma cadena para que se vea una línea de verificación en c #.

 String s1="testभारत"; bool isUnicode= System.Text.ASCIIEncoding.GetEncoding(0).GetString(System.Text.ASCIIEncoding.GetEncoding(0).GetBytes(s1)) != s1; 

Todos string tipos de datos de string C# / VB.NET están compuestos por caracteres Unicode.

ASCII define solo códigos de caracteres en el rango 0-127 . Unicode se define explícitamente como para superponerse en ese mismo rango con ASCII. Por lo tanto, si observa los códigos de caracteres en su cadena y contiene algo que sea superior a 127, la cadena contiene caracteres Unicode que no son caracteres ASCII.

Tenga en cuenta que ASCII incluye solo el alfabeto inglés. Por lo tanto, si (por cualquier razón) necesita aplicar el mismo enfoque a las cadenas que pueden contener caracteres acentuados (por ejemplo, texto en español), ASCII no es suficiente y debe buscar otro diferenciador.

ANSI caracteres ANSI [*] extiende los caracteres ASCII con los caracteres latinos acentuados antes mencionados en el rango 128-255 . Sin embargo, Unicode no se superpone con ANSI en ese rango, por lo que técnicamente una cadena Unicode puede contener caracteres que no son parte de ANSI, pero tienen el mismo código de carácter (específicamente en el rango 128-159 , como se puede ver en la tabla I vinculado a).

En cuanto al código real para hacer esto, la respuesta @chibacity debería funcionar, aunque debe modificarla para cubrir ASCII estricto, porque no funcionará para ANSI.

[*] También conocido como Latin 1 Windows (Win-1252)

Siempre que contenga caracteres , contiene caracteres Unicode.

De System.String :

Representa el texto como una serie de caracteres Unicode.

 public static bool ContainsUnicodeChars(string text) { return !string.IsNullOrEmpty(text); } 

Normalmente debe preocuparse por las diferentes codificaciones Unicode cuando debe:

  1. Codifique una cadena en una secuencia de bytes con una encoding particular.
  2. Decodifica una cadena de una secuencia de bytes con una encoding particular.

Sin embargo, una vez que esté en la tierra de cuerdas, la encoding con la que se representó originalmente la cuerda, si la hay, es irrelevante.

Cada carácter en una cadena está definido por un valor escalar Unicode, también llamado punto de código Unicode o el valor ordinal (numérico) del carácter Unicode. Cada punto de código se codifica utilizando la encoding UTF-16 , y el valor numérico de cada elemento de la encoding se representa mediante un objeto Char.

Quizás también pueda encontrar estas preguntas relevantes:

¿Cómo se pueden eliminar los caracteres que no son ASCII de una cadena? (Cª#)

C # Asegúrese de que la cadena contiene solo ASCII

Y este artículo de Jon Skeet: Unicode y .NET

Esta es otra solución sin usar expresiones lambda. Está en VB.NET pero puedes convertirlo fácilmente en C #:

  Public Function ContainsUnicode(ByVal inputstr As String) As Boolean Dim inputCharArray() As Char = inputstr.ToCharArray For i As Integer = 0 To inputCharArray.Length - 1 If CInt(AscW(inputCharArray(i))) > 255 Then Return True Next Return False End Function