VB.NET - chaîne de caractères nuls
Question
J'ai une valeur de chaîne lue à partir d'un fichier CSV. Le fichier CSV contient 7 octets de NULL
, je l'ai confirmé en l'ouvrant dans un éditeur hexadécimal et vous enought il y a 7 0x0
octets là-dedans. Cette chaîne est à l'origine de la douleur me.
Dans vb.net quand je vérifie la strlen
de cette chaîne, il renvoie une valeur de 7 et si je fais un String.IsNullOrWhitespace
retourne false
.
Je ne comprends pas pourquoi est-ce? Je diviser la chaîne en un tableau d'octets et chaque octet est 0x0
, qui est nulle / rien. Une comparaison de string = Nothing
échoue également.
Je veux être en mesure de remplacer cette chaîne par une chaîne de mon propre mais je ne peux pas le faire dynamiquement. Toute suggestion pourquoi cette chaîne renvoie une longueur de 7 même si chaque octet est 0x0
?
La solution
Le caractère nul n'est pas des espaces, et la référence de votre chaîne est rien, donc je me attends String.IsNullOrWhitespace()
pour revenir false
Autres conseils
Malheureusement, le caractère null
fois sept n'est pas une chaîne vide, ou une chaîne nulle. Rappelez-vous dans .NET est une chaîne à un certain niveau à un tableau de caractères . Une chaîne est nulle si ce pointeur est réglé sur null. Une chaîne est vide si le pointeur pointe vers un tableau de longueur zéro. Dans ce cas, le pointeur pointe sur une longueur de sept tableau de caractères nuls (l'octet étant tous des zéros).
chaîne NULL
A ->
Chaîne vide
A -> ()
Votre chaîne
A -> ((0) (0) (0) (0) (0) (0) (0))
Vous pouvez tester ce caractère nul en utilisant
char nullChar = char.ConvertFromUtf32(0);
string nullCharString = new String(nullChar);
bool hasNullChar = A.Contains(nullCharString);
vérifie IsNullEmptyOrWhitespace si la variable elle-même est nulle, pas si la chaîne contient des caractères NULL. Un caractère NULL n'est pas un espace. Donc, cette vérification échoue également.
Je vous suggère d'utiliser une garniture (), après le test. En C # cela ressemblera:
bool MyNullCheck(string s) {
if (s == null) return false;
s = s.Trim(new string(char.ConvertFromUtf32(0), 1));
return string.IsNullEmptyOrWhiteSpace(s);
}
Essayez de convertir VB (non vérifié)
Function MyNullCheck(s as String) as Boolean
If s Is Nothing Then
Return False
End If
s = s.Trim(New String(vbNullChar, 1))
Return String.IsNullEmptyOrWhiteSpace(s)
End Function
Un personnage avec le zéro de code de caractère est un caractère comme tout autre. Si vous avez une chaîne avec sept ces caractères, la longueur est de sept. Le caractère NUL est pas un caractère d'espace blanc et une chaîne de caractères contenant des caractères NUL est pas identique à une référence de chaîne qui est nulle (Rien).
Vous pouvez utiliser la méthode Trim
(ou TrimEnd
) pour supprimer les caractères NUL en spécifiant qu'il doit couper les caractères NUL: str = str.Trim(Chr(0))
, mais je pense que vous devriez plutôt vous demander pourquoi il y a des caractères NUL dans la chaîne pour commencer.
Est-ce que vous lisez correctement les données à partir du fichier? Une erreur courante consiste à utiliser la méthode de Read
pour lire à partir d'un courant, mais en ignorant cette valeur de retour et ainsi de se retrouver avec un tampon que partiellement rempli avec les données du flux. Comme un tableau d'octets est rempli de zéros lors de sa création, les octets non défini par l'opération de Read
resterait zéro et devenir des caractères NUL lorsque vous décoder les données dans une chaîne.
- Chaîne null est une qui n'a pas été initialisé ou a été réglé sur
Nothing
. - Chaîne vide est celui qui contient la chaîne vide
String.Empty
ou""
. - caractères sont l'espace entre les espaces blancs, onglet, saut de ligne, retour chariot et . Mais pas le caractère nul.
- Votre chaîne est ni vide ni
Nothing
. Il contient 7 caractères, chacun est le caractère nul -. Il est donc pas des espaces
Vous pouvez utiliser String.Replace supprimer les caractères zéro? Quelque chose comme ceci
s = s.Replace(vbNullChar, "")
Je parie que vous avez exécuté dans un problème de codage. Essayez de lire le fichier en UTF-16