VB.NET - Kette von Nullen
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
?
Lösung
Das Null-Zeichen ist nicht Leerzeichen, und die Zeichenfolge Referenz ist nicht nichts, so würde ich erwarten, String.IsNullOrWhitespace()
false
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)
konvertierenFunction 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