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!
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!
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.
Todos C#
/VB.NET
string
Los tipos de datos se componen de caracteres Unicode.
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:
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
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)
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
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;
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. –
Quiero saber si algo cumple con ASCII o no ... (cumpla totalmente) – Himberjack
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