Frage

Ich habe einen Wert Zeichenfolge an, die aus einer CSV-Datei. Die CSV-Datei enthält 7 NULL Bytes, ich habe dies in einem Hex-Editor bestätigt öffnen und sicher genug gibt es 7 0x0 dort Bytes. Diese Saite verursacht mir Schmerzen.

In vb.net, wenn ich die strlen dieser Zeichenfolge überprüfen sie einen Wert von 7 zurückkehrt und wenn ich eine String.IsNullOrWhitespace tun gibt es false.

Ich kann nicht verstehen, warum das so ist? Ich habe die Zeichenfolge in einen Byte-Array aufgeteilt und jedes Byte ist 0x0, die null / nichts. Ein string = Nothing Vergleich schlägt ebenfalls fehl.

Ich mag mit einer Reihe von meinem eigenen diese Zeichenfolge ersetzen können, aber ich kann diese dynamisch nicht tun. Irgendwelche Vorschläge, warum diese Zeichenfolge zurückgibt eine Länge von 7 obwohl jedes Byte ist 0x0?

War es hilfreich?

Lösung

Das Null-Zeichen ist nicht Leerzeichen, und die Zeichenfolge Referenz ist nicht nichts, so würde ich erwarten, String.IsNullOrWhitespace() false

zurück

Andere Tipps

Leider ist der null Charakter siebenmal ist keine leere Zeichenfolge oder eine leere Zeichenfolge. Denken Sie daran, in NET ist ein String auf einer bestimmten Ebene eine pointer auf eine Zeichen-Array . Ein String ist null, wenn dieser Zeiger auf null gesetzt wird. Ein String ist, wenn der Zeiger auf ein Null-Länge-Array leer. In diesem Fall wird der Zeiger zeigt auf eine Länge von sieben Array von Null-Zeichen (das Byte alle Nullen sind).

Null String

  

A ->

leere Zeichenfolge

  

A -> ()

Ihr String

  

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

Sie können für diese Null-Zeichen testen, indem Sie mit

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

IsNullEmptyOrWhitespace überprüft, ob die Variable selbst null ist, nicht, wenn die Zeichenfolge enthält NULL-Zeichen. Ein NULL-Zeichen kein Leerzeichen. Also diese Prüfung fehlschlägt auch.

Ich schlage vor, Sie einen Trim () verwenden, nach dem Test. In C # wird dies wie folgt aussehen:

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

Versuchen Sie, VB (nicht geprüft)

konvertieren
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

Ein Zeichen mit dem Zeichencode Null ist ein Zeichen wie jedes andere. Wenn Sie eine Zeichenfolge mit sieben solcher Zeichen haben, ist die Länge sieben. Das NUL-Zeichen ist kein Leerraumzeichen, und eine String-Zeichen enthält NUL ist nicht das gleiche wie eine String-Referenz, die null (Nothing) ist.

Sie könnten die Trim Methode (oder TrimEnd) verwenden, um die NUL-Zeichen zu entfernen, indem Sie angeben, dass es NUL-Zeichen trimmen sollte: str = str.Trim(Chr(0)), aber ich denke, dass man eher sich fragen sollten, warum NUL-Zeichen gibt es in der Zeichenfolge ist, mit zu beginnen.

Lesen Sie die Daten richtig aus der Datei? Ein häufiger Fehler ist es, das Verfahren zu verwenden Read aus einem Strom zu lesen, aber es ist Rückgabewert ignoriert und somit mit einem Puffer endet nur teilweise mit Daten aus dem Strom gefüllt. Als ein Byte-Array mit Nullen aufgefüllt wird, wenn Sie es schaffen, Bytes, die nicht durch den Read Betrieb gesetzt würde Null und werden NUL-Zeichen bleiben, wenn Sie die Daten in einen String zu dekodieren.

  • A null string ist eine, die nicht initialisiert hat oder Satz zu Nothing gewesen.
  • Ein leer string ist eine, die die leere Zeichenkette String.Empty oder "" enthält.
  • Leerzeichen Zeichen sind Leerzeichen, Tabulator, Newline, Carriage Return und vieles mehr . Aber nicht die Null-Zeichen.
  • Ihr String ist weder leer noch Nothing. Es besteht aus 7 Zeichen, ist jeder der Null-Zeichen -. So ist es nicht Leerzeichen ist

könnten Sie String.Replace entfernen Sie die Null-Zeichen? So etwas wie diese

s = s.Replace(vbNullChar, "")

ich wette, dass Sie in eine Codierung Problem ausgeführt haben. Versuchen Sie die Datei als UTF-16

Lesen
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top