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!
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.
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;
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)
Tout C#
/VB.NET
string
les types de données sont composés de caractères Unicode.
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:
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
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