VB.NET - serie de valores nulos
Pregunta
I tiene un valor de cadena leer desde un archivo CSV. El archivo CSV contiene 7 bytes NULL
, me han confirmado esta abriéndolo en un editor hexadecimal y lo suficientemente seguro de que hay 7 0x0
Bytes allí. Esta cadena está causando dolor me.
En vb.net cuando compruebo la strlen
de esta cadena que devuelve un valor de 7 y si hago un String.IsNullOrWhitespace
vuelve false
.
No puedo entender por qué esto es? He dividir la cadena en una matriz de bytes y cada byte es 0x0
, que es nulo / nada. Una comparación string = Nothing
también falla.
Quiero ser capaz de reemplazar esta cadena con una cadena de mi propia pero no puedo hacer esto de forma dinámica. Cualquier sugerencia por qué esta cadena devuelve una longitud de 7 a pesar de que cada byte es 0x0
?
Solución
El carácter nulo no es un espacio en blanco, y su cadena de referencia no es nada, por lo que se puede esperar para volver String.IsNullOrWhitespace()
false
Otros consejos
Por desgracia los caracteres null
veces siete no es una cadena vacía, o una cadena nula. Recuerde que en .NET es una cadena en algún nivel de un puntero a una matriz de caracteres . Una cadena es nula si este puntero se establece en NULL. Una cadena está vacía si el puntero apunta a una matriz de longitud cero. En este caso el puntero apunta a una longitud de siete array de caracteres nulos (el byte de ser todos ceros).
cadena nula
A ->
cadena vacía
A -> ()
Su cadena
A -> ((0) (0) (0) (0) (0) (0) (0))
Se puede probar para este carácter nulo utilizando
char nullChar = char.ConvertFromUtf32(0);
string nullCharString = new String(nullChar);
bool hasNullChar = A.Contains(nullCharString);
comprueba si la variable IsNullEmptyOrWhitespace sí es nula, no si la cadena contiene caracteres NULL. Un carácter nulo no es un espacio en blanco. Así que esta comprobación también falla.
Le sugiero que use un Trim (), después de la prueba. En C # esto se verá así:
bool MyNullCheck(string s) {
if (s == null) return false;
s = s.Trim(new string(char.ConvertFromUtf32(0), 1));
return string.IsNullEmptyOrWhiteSpace(s);
}
Trate de convertir a VB (no verificado)
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 personaje con el cero código de caracteres es un personaje al igual que cualquier otra. Si usted tiene una cadena con siete de estos caracteres, la longitud es de siete. El carácter NUL no es un carácter de espacio en blanco, y una cadena que contiene caracteres NUL no es lo mismo que una cadena de referencia que es nulo (Nada).
Se puede utilizar el método Trim
(o TrimEnd
) para eliminar los caracteres NUL especificando que debe recortar caracteres NUL: str = str.Trim(Chr(0))
, pero creo que se debe y no se pregunta por qué hay caracteres NUL en la cadena para empezar.
¿Usted está leyendo los datos correctamente desde el archivo? Un error común es utilizar el método Read
para leer de una corriente, pero ignorando el mismo de valor de retorno y por lo tanto terminar con un tampón sólo parcialmente llena con los datos de la corriente. Como una matriz de bytes se llena de ceros cuando se crea, no por bytes del conjunto de la operación Read
permanecería cero y convertido en caracteres NUL cuando decodificar los datos en una cadena.
- nula es una cadena que no se ha inicializado o se ha establecido en
Nothing
. - Un vacío es una cadena que contiene la cadena vacía o
String.Empty
""
. - espacios en blanco son el espacio, tabulación, nueva línea, retorno de carro y un montón más . Pero no el carácter nulo.
- La cadena no es ni vacío ni
Nothing
. Contiene 7 caracteres, cada uno de ellos es el carácter nulo -. Por lo que no es un espacio en blanco
String.Replace a quitar los caracteres cero? Algo como esto
s = s.Replace(vbNullChar, "")
apuesto a que se han topado con un problema de codificación. Trate de leer el archivo como UTF-16