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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top