Domanda

Ho un valore stringa leggere da un file CSV. Il file CSV contiene 7 byte NULL, mi hanno confermato questo aprendolo in un editor esadecimale e sicura d'accontentarvi ci sono 7 0x0 byte in là. Questa stringa sta causando dolore mi.

In vb.net quando controllo la strlen di questa stringa restituisce un valore di 7 e se faccio un String.IsNullOrWhitespace restituisce false.

Non riesco a capire perché questo è? Ho diviso la stringa in una matrice di byte e ogni byte è 0x0, che è nullo / nulla. Un confronto string = Nothing riesce anche.

Voglio essere in grado di sostituire questa stringa con una stringa della mia, ma non posso fare questo in modo dinamico. Eventuali suggerimenti perché questo String Restituisce una lunghezza di 7 anche se ogni byte è 0x0?

È stato utile?

Soluzione

il carattere null non è uno spazio, e il vostro riferimento stringa non è nulla, quindi mi aspetterei String.IsNullOrWhitespace() per tornare false

Altri suggerimenti

Purtroppo i tempi di sette caratteri null non è una stringa vuota, o una stringa nulla. Ricordate che in .NET una stringa è a un certo livello di una puntatore a un array di caratteri . Una stringa è null se questo puntatore viene spostato nullo. Una stringa è vuota se il puntatore punta a un array di lunghezza zero. In questo caso i punti puntatore ad una lunghezza sette array di caratteri null (byte essendo tutti zeri).

stringa Null

  

A ->

stringa vuota

  

A -> ()

Il tuo Stringa

  

A -> ((0) (0) (0) (0) (0) (0) (0))

È possibile verificare per questo carattere null utilizzando

char nullChar = char.ConvertFromUtf32(0);
string nullCharString = new String(nullChar);
bool hasNullChar = A.Contains(nullCharString);

controlli IsNullEmptyOrWhitespace se la variabile stessa è nullo, non se la stringa contiene caratteri NULL. Un carattere NULL non è uno spazio bianco. Quindi questo controllo ha esito negativo anche.

Vi suggerisco di utilizzare un Trim (), dopo la prova. In C # questo sarà simile a:

bool MyNullCheck(string s) {
    if (s == null) return false;
    s = s.Trim(new string(char.ConvertFromUtf32(0), 1));
    return string.IsNullEmptyOrWhiteSpace(s);
}

Prova a convertire in VB (non verificata)

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 personaggio con il codice di carattere zero è un personaggio come qualsiasi altro. Se si dispone di una stringa con sette tali caratteri, la lunghezza è di sette. Il carattere NUL non è un carattere spazio vuoto, e una stringa contenente caratteri NUL non è la stessa come riferimento stringa che è nullo (Nulla).

Si potrebbe utilizzare il metodo Trim (o TrimEnd) per rimuovere i caratteri NUL specificando che dovrebbe tagliare caratteri NUL: str = str.Trim(Chr(0)), ma penso che si dovrebbe piuttosto chiedersi il motivo per cui non v'è caratteri NUL nella stringa per iniziare.

Stai leggendo i dati correttamente dal file? Un errore comune è quello di utilizzare il metodo Read per leggere da un flusso, ma ignorando il suo valore di ritorno e finire con un tampone solo parzialmente riempito con dati dal flusso così. Come un array di byte è riempito con zeri al momento della creazione, il non byte impostato dall'operazione Read rimarrebbe zero e diventare caratteri NUL quando si decodifica i dati in una stringa.

  • A Null stringa è uno che non è stato inizializzato o è stato impostato Nothing.
  • Un vuoto stringa è quello che contiene la String.Empty stringa vuota o "".
  • I caratteri di spaziatura sono lo spazio, tab, newline, ritorno a capo e molto altro ancora . Ma non il carattere null.
  • La stringa non è né vuota né Nothing. Esso contiene 7 caratteri, ognuno è il carattere null -. Quindi non è uno spazio

Si potrebbe usare String.Replace per rimuovere le zero caratteri? Qualcosa di simile a questo

s = s.Replace(vbNullChar, "")

Scommetto che è stato eseguito in un problema di codifica. Provate a leggere il file come UTF-16

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top