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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top