2010-12-16 22 views
22

Tengo una cadena y quiero saber si tiene caracteres Unicode dentro o no. (si contiene ASCII por completo o no)¿Cómo reconocer si una cadena contiene caracteres unicode?

¿Cómo puedo lograr eso?

Gracias!

+2

Creo que es necesario que nos diga más, ya que todas las cadenas en .NET son unicode. ¿Tienes miedo de perder algunos personajes en un proceso de codificación? Si es así, díganos para qué quiere usar el conocimiento. –

+0

Quiero saber si algo cumple con ASCII o no ... (cumpla totalmente) – Himberjack

+1

use una expresión regular, esta sería una pregunta relacionada Una expresión regular se puede usar para reemplazar o para hacer coincidir. La siguiente respuesta se trata de reemplazar, pero también puede usar una expresión regular para emparejar http://stackoverflow.com/questions/7411438/remove-characters-from-c-sharp-string – barlop

Respuesta

54

Si mis suposiciones son correctas desea para 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); 
    } 

actualización

Esto detectará de 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.

5

Todos C#/VB.NETstring Los tipos de datos se componen de caracteres Unicode.

2

Mientras 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 tiene que preocuparse por diferentes codificaciones Unicode cuando se tiene que:

  1. Codificar una cadena en un flujo de bytes con una codificación particular.
  2. Decode una cadena de una secuencia de bytes con una codificación particular.

Sin embargo, una vez que esté en el campo de las cuerdas, la codificación con la que se representó originalmente la cuerda, si corresponde, es irrelevante.

Cada carácter de una cadena se define por un valor escalar Unicode, también llamado un punto de código Unicode o el valor ordinal (numérico) de la de caracteres Unicode. Cada punto de código está codificado mediante el uso de la codificación UTF-16, y el valor numérico de cada elemento de la codificación está representado por un objeto Char .

Quizás que puede que encuentre estas preguntas relevantes:

How can you strip non-ASCII characters from a string? (in C#)

C# Ensure string contains only ASCII

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

5

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 juego de caracteres [*] 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 vinculada 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 América 1 Windows (Win-1252)

0

Esta es otra solución sin usar expresiones lambda. Es en VB.NET, pero se puede convertir 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 
1

Si una cadena contiene sólo caracteres ASCII, una serialización + deserialización paso utilizando la codificación ASCII debe volver a la misma cadena por lo que un cheque un trazador de líneas en C# podría verse como ..

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