web-dev-qa-db-fra.com

Comment reconnaître si une chaîne contient des caractères Unicode?

J'ai une chaîne et je veux savoir si elle contient ou non des caractères Unicode. (s'il contient entièrement ASCII ou non)

Comment puis-je y parvenir?

Merci!

33
Himberjack

Si mes hypothèses sont correctes, vous souhaitez savoir si votre chaîne contient des caractères "non ANSI". Vous pouvez dériver ceci comme suit.

    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);
    }

Mise à jour

Cela détectera l'ASCII étendu. Si vous ne détectez que la vraie plage de caractères ASCII (jusqu'à 127), vous pouvez potentiellement obtenir des faux positifs pour les caractères ASCII ASCII $ qui ne désignent pas Unicode) . J'y ai fait allusion dans mon échantillon.

60
Tim Lloyd

Si une chaîne ne contient que des caractères ASCII, une étape de sérialisation + désérialisation utilisant ASCII devrait récupérer la même chaîne afin qu'une vérification d'une ligne en c # puisse ressembler à ..

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

ASCII définit uniquement les codes de caractères dans la plage 0-127. Unicode est explicitement défini de manière à se chevaucher dans cette même plage avec ASCII. Ainsi, si vous examinez les codes de caractères dans votre chaîne et qu'il contient tout ce qui est supérieur à 127, la chaîne contient des caractères Unicode qui ne sont pas des caractères ASCII.

Notez que ASCII comprend uniquement l'alphabet anglais. Ainsi, si vous (pour une raison quelconque) devez appliquer la même approche aux chaînes pouvant contenir des caractères accentués (texte espagnol par exemple), ASCII n'est pas suffisant et vous devez rechercher un autre différenciateur.

ANSI le jeu de caractères [*] étend les caractères ASCII avec les caractères latins accentués susmentionnés dans la plage 128-255. Cependant, Unicode ne chevauche pas ANSI dans cette plage, donc techniquement une chaîne Unicode peut contenir des caractères qui ne font pas partie d'ANSI, mais ont le même code de caractère (spécifiquement dans la plage 128-159, Comme vous pouvez le voir sur le tableau auquel je suis lié).

En ce qui concerne le code réel pour ce faire, la réponse @chibacity devrait fonctionner, bien que vous deviez le modifier pour couvrir l'ASCII strict, car il ne fonctionnera pas pour ANSI.

[*] Également connu sous le nom de Latin 1 Windows (Win-1252)

5
Franci Penov

Tout C#/VB.NETstring les types de données sont composés de caractères Unicode.

1
Mitch Wheat

Tant qu'il contient caractères, il contient des caractères Unicode.

De System.String :

Représente le texte sous la forme d'une série de caractères Unicode.

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

Vous devez normalement vous soucier des différents encodages Unicode lorsque vous devez:

  1. Encode une chaîne into un flux d'octets avec un encodage particulier.
  2. Decode une chaîne from un flux d'octets avec un encodage particulier.

Une fois que vous êtes dans le domaine des chaînes, l'encodage avec lequel la chaîne était initialement représentée, le cas échéant, n'est pas pertinent.

Chaque caractère d'une chaîne est défini par une valeur scalaire Unicode, également appelée point de code Unicode ou valeur ordinale (numérique) du caractère Unicode. Chaque point de code est codé à l'aide du codage UTF-16 , et la valeur numérique de chaque élément du codage est représentée par un objet Char.

Peut-être vous pourriez également trouver ces questions pertinentes:

Comment supprimer des caractères non ASCII d'une chaîne? (En C #)

C # Assurez-vous que la chaîne ne contient que de l'ASCII

Et cet article de Jon Skeet: nicode et .NET

1
Ani

Il s'agit d'une autre solution sans utiliser d'expressions lambda. C'est dans VB.NET mais vous pouvez le convertir facilement 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
0
Yiannis Mpourkelis